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
陳述式 (並行插入)。然而,如果您在持有鎖定的同時要使用伺服器外部的程序來操作資料庫,則無法使用此選項。