這些效能提示補充了 第 10.2.5.1 節「最佳化 INSERT 陳述式」中快速插入的一般準則。
對於
MyISAM
表格,如果資料檔案中間沒有已刪除的列,您可以使用並行插入,在執行SELECT
陳述式的同時新增列。請參閱 第 10.11.3 節「並行插入」。如果表格有許多索引,經過一些額外的工作,可以使
LOAD DATA
對MyISAM
表格的執行速度更快。使用以下程序執行
FLUSH TABLES
陳述式或 mysqladmin flush-tables 命令。使用 myisamchk --keys-used=0 -rq
/path/to/db/tbl_name
來移除表格的所有索引使用。使用
LOAD DATA
將資料插入表格。這不會更新任何索引,因此速度非常快。如果您打算日後僅從表格讀取資料,請使用 myisampack 來壓縮它。請參閱 第 18.2.3.3 節「壓縮表格特性」。
使用 myisamchk -rq
/path/to/db/tbl_name
重新建立索引。這會在將索引樹寫入磁碟之前先在記憶體中建立,這比在LOAD DATA
期間更新索引快得多,因為它避免了大量的磁碟搜尋。產生的索引樹也是完全平衡的。執行
FLUSH TABLES
陳述式或 mysqladmin flush-tables 命令。
如果插入資料的
MyISAM
資料表為空,LOAD DATA
會自動執行上述最佳化。自動最佳化與明確使用此程序的主要區別在於,您可以讓 myisamchk 為索引建立分配更多的暫存記憶體,而不是您希望伺服器在執行LOAD DATA
陳述式時為索引重建分配的記憶體。您也可以使用以下陳述式,而不是 myisamchk,來停用或啟用
MyISAM
資料表的非唯一索引。如果您使用這些陳述式,則可以略過FLUSH TABLES
操作。ALTER TABLE tbl_name DISABLE KEYS; ALTER TABLE tbl_name ENABLE KEYS;
若要加速針對非交易式資料表執行多個陳述式的
INSERT
操作,請鎖定您的資料表。LOCK TABLES a WRITE; INSERT INTO a VALUES (1,23),(2,34),(4,33); INSERT INTO a VALUES (8,26),(6,29); ... UNLOCK TABLES;
這有助於效能,因為索引緩衝區只會在所有
INSERT
陳述式完成後才刷新到磁碟。通常,索引緩衝區刷新的次數會與INSERT
陳述式的數量相同。如果可以用單一INSERT
插入所有列,則不需要明確的鎖定陳述式。鎖定也會減少多個連線測試的總時間,儘管個別連線的最大等待時間可能會增加,因為它們會等待鎖定。假設有五個用戶端嘗試同時執行插入操作,如下所示:
連線 1 執行 1000 次插入
連線 2、3 和 4 各執行 1 次插入
連線 5 執行 1000 次插入
如果您不使用鎖定,連線 2、3 和 4 會在 1 和 5 之前完成。如果您使用鎖定,連線 2、3 和 4 可能不會在 1 或 5 之前完成,但總時間應該快約 40%。
INSERT
、UPDATE
和DELETE
操作在 MySQL 中速度非常快,但您可以透過在執行超過大約五次連續插入或更新的所有操作周圍新增鎖定來獲得更好的整體效能。如果您執行非常多次連續插入,您可以偶爾(大約每 1,000 列)執行一次LOCK TABLES
,然後執行一次UNLOCK TABLES
,以允許其他執行緒存取資料表。這仍然會帶來良好的效能提升。若要提高
MyISAM
資料表的效能,無論是LOAD DATA
還是INSERT
,請透過增加key_buffer_size
系統變數來擴大金鑰快取。請參閱第 7.1.1 節,「設定伺服器」。