表大小以 N log N (B-Tree) 速度影響索引插入。初始開表開銷每併發查詢一次。
INSERT INTO t VALUES (1,2),(3,4),(5,6); -- 比多條單值 INSERT 快數倍
資料入佇列即返回,服務器空閒時批量寫入,降低鎖衝突。
表無刪除產生的「空洞」時,SELECT 與末尾 INSERT 可並發。
優化流程:
CREATE TABLE 建表 (可用 mysql 或 Perl-DBI)。FLUSH TABLES 或 mysqladmin flush-tables。myisamchk --keys-used=0 -rq /path/to/db/tbl — 禁用所有索引。LOAD DATA INFILE 載入資料 (不更新索引,極快)。myisampack。myisamchk -r -q /path/to/db/tbl — 重建索引 (記憶體中建樹,避免磁碟搜尋,索引完美平衡)。FLUSH TABLES。未來版本將此流程整合進 LOAD DATA INFILE 內部。
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 完成後刷盤一次。單條語句插入所有行則無需鎖定。鎖定會降低整體時間 ~40%,但增加部分執行緒等待時間。建議每 1000 行做一次 UNLOCK/LOCK 釋放併發。
INSERT。INSERT DELAYED。LOAD DATA INFILE + 禁用/重建索引流程 (最快)。LOCK TABLES + 定期解鎖。