MyISAM
儲存引擎支援並行插入,以減少特定資料表的讀取器和寫入器之間的爭用:如果 MyISAM
資料表的資料檔案中沒有漏洞 (中間沒有已刪除的列),則可以執行 INSERT
陳述式,在 SELECT
陳述式正在從資料表讀取列的同時,將列新增至資料表結尾。如果有多个 INSERT
陳述式,則它們會排隊並依序執行,與 SELECT
陳述式並行執行。並行 INSERT
的結果可能不會立即顯示。
可以設定 concurrent_insert
系統變數來修改並行插入處理。預設情況下,變數設定為 AUTO
(或 1),並且並行插入會如上所述進行處理。如果 concurrent_insert
設定為 NEVER
(或 0),則會停用並行插入。如果變數設定為 ALWAYS
(或 2),即使是具有已刪除列的資料表,也允許在資料表結尾進行並行插入。另請參閱 concurrent_insert
系統變數的描述。
如果您正在使用二進位日誌,則會將 CREATE ... SELECT
或 INSERT ... SELECT
陳述式的並行插入轉換為正常插入。這麼做是為了確保您可以在備份操作期間透過套用日誌來重新建立資料表的精確副本。請參閱第 7.4.4 節,「二進位日誌」。此外,對於這些陳述式,系統會將讀取鎖定放置在選取的資料表上,使得對該資料表的插入遭到封鎖。這樣做的效果是,該資料表的並行插入也必須等待。
使用 LOAD DATA
時,如果您為滿足並行插入條件的 MyISAM
資料表 (也就是說,其中間沒有空閒區塊) 指定 CONCURRENT
,則其他工作階段可以在 LOAD DATA
正在執行時從資料表擷取資料。即使沒有其他工作階段同時使用該資料表,使用 CONCURRENT
選項也會稍微影響 LOAD DATA
的效能。
如果您指定 HIGH_PRIORITY
,則它會覆寫如果伺服器是以該選項啟動的 --low-priority-updates
選項的效果。它也會導致不使用並行插入。
對於 LOCK TABLE
,READ LOCAL
和 READ
之間的差異在於 READ LOCAL
允許在持有鎖定的同時執行非衝突的 INSERT
陳述式 (並行插入)。但是,如果您要在持有鎖定的同時使用伺服器外部的程序來操作資料庫,則無法使用此選項。