10.2.5.1 優(yōu)化INSERT語句
版本8.0
為了優(yōu)化插入速度,可以將多個小操作合并為一個大操作。理想情況下,建立一次連接,一次性發(fā)送多個新行的數(shù)據(jù),并將所有索引更新和一致性檢查推遲到最后進行 。
插入一行所需的時間由以下因素決定,其中數(shù)字表示大致比例:
- 連接:(3)
- 向服務(wù)器發(fā)送查詢:(2)
- 解析查詢:(2)
- 插入行:(1×行大?。?/li>
- 插入索引:(1×索引數(shù)量)
- 關(guān)閉連接:(1)
這里沒有考慮打開表的初始開銷,每個并發(fā)運行的查詢都會執(zhí)行一次打開表操作。
假設(shè)使用B樹索引,表的大小會使索引插入速度降低logN倍。
可以使用以下方法加快插入速度:
- 如果要從同一客戶端同時插入多行數(shù)據(jù),可以使用帶有多個
VALUES列表的INSERT語句,一次插入多行。這比使用單獨的單行INSERT語句要快得多(在某些情況下快很多倍)。如果要向非空表添加數(shù)據(jù),可以調(diào)整bulk_insert_buffer_size變量,使數(shù)據(jù)插入速度更快。請參見7.1.8節(jié) “服務(wù)器系統(tǒng)變量”。 - 從文本文件加載表時,使用
LOAD DATA。這通常比使用INSERT語句快20倍。請參見15.2.9節(jié) “LOAD DATA語句”。 - 利用列的默認值特性。僅當要插入的值與默認值不同時,才顯式插入值。這可以減少MySQL必須進行的解析工作,提高插入速度。
有關(guān)InnoDB表的特定提示,請參見10.5.5節(jié) “InnoDB表的批量數(shù)據(jù)加載”。
有關(guān)MyISAM表的特定提示,請參見10.6.2節(jié) “MyISAM表的批量數(shù)據(jù)加載”。
10.2.5.2 優(yōu)化UPDATE語句
版本8.0
UPDATE語句的優(yōu)化方式與SELECT查詢類似,但額外增加了寫入操作的開銷。寫入速度取決于更新的數(shù)據(jù)量以及更新的索引數(shù)量,未發(fā)生變化的索引不會被更新。
另一種實現(xiàn)快速更新的方法是延遲更新操作,之后再連續(xù)進行多個更新。如果鎖定表,那么一次性執(zhí)行多個更新操作比逐個執(zhí)行要快得多。
對于采用動態(tài)行格式的MyISAM表而言,若將一行更新為總長度更長的數(shù)據(jù),可能會導致該行分裂。如果經(jīng)常執(zhí)行這類操作,偶爾使用OPTIMIZE TABLE語句就顯得尤為重要。請參見15.7.3.4節(jié) “OPTIMIZE TABLE語句”。
10.2.5.3 優(yōu)化DELETE語句
刪除MyISAM表中單行數(shù)據(jù)所需的時間與索引數(shù)量成正比。若要更快地刪除行,可以通過增大key_buffer_size系統(tǒng)變量的值來擴大鍵緩存的大小,相關(guān)內(nèi)容可查看7.1.1節(jié) “配置服務(wù)器”。
若要刪除MyISAM表中的所有行,使用TRUNCATE TABLE tbl_name比DELETE FROM tbl_name的速度更快。不過,截斷操作不具備事務(wù)安全性,如果在活躍事務(wù)或表處于鎖定狀態(tài)時嘗試執(zhí)行截斷操作,將會報錯。更多信息可參考15.1.37節(jié) “TRUNCATE TABLE語句”。