天天看點

Myisam表的concurrent inserts特性一、特性介紹二、concurrent_insert參數三、測試示例

一、特性介紹

在某些特定的情況下,Myisam引擎支援并發插入(concurrent inserts),以降低讀操作和寫操作的争用:如果一個myisam表的資料檔案中間沒有空閑塊(free blocks),那麼新的資料行将總是被插入到資料檔案的末尾,在這種情況下,該myisam表上将允許同時有insert和select操作而不會有鎖沖突。也就是說,當myisam表上有其它會話在讀取表資料,你也照樣可以執行insert操作。

二、concurrent_insert參數

Myisam表中間的資料行被删除或更新,就可能導緻空閑塊。如果表檔案中間有空閑塊,那麼并發插入特性将不生效,直到空閑塊被資料行填滿後才自動生效。Myisam引擎的這種行為,可以通過系統變量concurrent_insert來控制:

mysql> show variables like '%concurrent_insert%';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| concurrent_insert | AUTO  |
+-------------------+-------+           

該參數有三個值:never、auto、always。

值為never(或0),不啟用并發插入功能;

值為auto(或1),自動模式,當資料檔案中間沒有空閑塊則啟用,否則自動取消;

值為always(或2):即便表資料檔案中間有空閑塊也始終啟用并發插入。當有空閑塊時,表上有其它會話的讀操作,這時新的資料行将被插入到檔案的末尾;如果表上沒有其它操作,那麼insert操作就是一個正常的操作:獲得一個寫鎖,并優先将資料行插入空閑塊中。

三、測試示例

在空表myisam_tb中導入了64條資料,無任何删除操作,且表引擎為myisam。在session1上模拟出一個對myisam_tb表的慢查詢:

mysql> select *,sleep(1) from myisam_tb where sex='f';
執行時間40s,輸出結果忽略           

此時在session2上,插入id為65的資料:

mysql> insert into myisam_tb values(65,'he','f',385685.32,'fbbf');
Query OK, 1 row affected (0.01 sec)           

可以看到insert語句資料直接可以插入進去,并沒有發生鎖等待現象。将myisam_tb表中删除中間一部分資料:

mysql> delete from myisam_tb where id between 20 and 40;
Query OK, 21 rows affected (0.01 sec)           

再執行慢查詢:

mysql> select *,sleep(1) from myisam_tb where sex='f';           

另外一個會話上再執行insert語句,插入一條新資料:

mysql> insert into myisam_tb values(66,'he','f',385685.32,'fbbf');
Query OK, 1 row affected (25.57 sec)           

可以看到語句執行了25s,這是因為表有空閑塊,concurrent_insert參數值為auto,是以出現了鎖等待。

将concurrent_insert參數值修改為always:

mysql> show variables like '%concurrent%';
+-------------------+--------+
| Variable_name     | Value  |
+-------------------+--------+
| concurrent_insert | ALWAYS |
+-------------------+--------+           

Session1上再執行一個慢查詢:

mysql> select *,sleep(1) from myisam_tb;
執行時間45s,輸出結果忽略           

session2上插入一條資料:

mysql> insert into myisam_tb values(67,'hgj','f',3232,'bngj');
Query OK, 1 row affected (0.00 sec)           

可以看出在concurrent_insert參數值改為always後,即便是有空閑塊,新插入的資料也是插在資料檔案的末尾。同樣也可以實作查詢與插入操作并存,不過空閑塊空間不會被利用。

繼續閱讀