這些效能提示補充了第 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
陳述式時為重新建立索引配置的暫存記憶體要多得多。您也可以使用以下語句來停用或啟用
MyISAM
表格的非唯一索引,而無需使用 myisamchk。如果您使用這些語句,則可以跳過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 節,「設定伺服器」。