對於事務表,使用 BEGIN / COMMIT 替代 LOCK TABLES 可顯著提升插入速度。雖然鎖定會增加單查詢最大等待時間,但整體批量插入耗時可降低約 40%。
Connection 1: 1000 inserts
Connections 2,3,4: 各 1 insert
Connection 5: 1000 inserts
無鎖時,連接 2/3/4 會先完成;加鎖後雖順序改變,但總耗時縮短 40% 左右。
連續插入/更新超過 5 次時,加鎖可獲得更好整體性能。大量插入時,每 1000 行執行一次 UNLOCK TABLES 釋放鎖,讓其他線程訪問,兼顧性能與並發。
LOAD DATA INFILE 速度遠快於 INSERT,即使使用上述優化策略。對 MyISAM 表,增加 key_buffer_size 可擴大鍵緩衝區,加速兩者。
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [(col_name,...)]
VALUES ({expr | DEFAULT},...),(...),...
[ON DUPLICATE KEY UPDATE col_name=expr, ...]
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name
SET col_name={expr | DEFAULT}, ...
[ON DUPLICATE KEY UPDATE col_name=expr, ...]
INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [(col_name,...)]
SELECT ... [ON DUPLICATE KEY UPDATE col_name=expr, ...]
INSERT DELAYED 後,服務端將行放入隊列,立即返回狀態,客戶端可繼續工作VALUES 列表形式,SELECT 和 ON DUPLICATE KEY UPDATE 會被忽略LAST_INSERT_ID() 獲取自增 IDkill -9 或崩潰會導致未刷盤數據丟失LOAD DATA INFILEBEGIN/COMMIT 替代表鎖DELAYED 異步寫入(接受數據丟失風險)key_buffer_size 服務 MyISAM 索引緩衝