id PK, c1, c2, c3, c4 VARCHAR(200)| 索引配置 | 相對無索引效能 |
|---|---|
| 自增主鍵 | +3.11%(提升) |
| 自增主鍵 + 二級索引 | -27.37%(下降) |
💡 **InnoDB 表務必有自增主鍵**,順序寫入極大提升插入效能;二級索引會帶來維護成本,按需建立。
| 提交頻率 | 相對一次性提交 | 耗時倍數 |
|---|---|---|
| 一次性提交(最後 commit) | 基準 | 1.00x |
| 每 10 萬行 | -1.17% | 1.01x |
| 每 1 萬行 | -3.01% | 1.03x |
| 每 1 千行 | -23.38% | 1.23x |
| 每 100 行 | -24.44% | 1.24x |
| 每 10 行 | -92.78% | 1.93x |
| 每 1 行(自動提交) | -546.78% | 6.47x |

| 場景 | 建議策略 |
|---|---|
| 批量資料導入(非高併發) | **批量提交**,或僅最後提交一次 |
| 高併發線上業務 | **盡快提交**,避免鎖範圍擴大、阻塞其他事務 |
| mysqldump 導入 | 必須啟用 --extended-insert,否則慢 5 倍以上 |
CREATE PROCEDURE insert_mytab(IN rownum INT, IN commitrate INT)
BEGIN
DECLARE i INT DEFAULT 0;
SET AUTOCOMMIT = 0;
WHILE i < rownum DO
INSERT INTO mytab(c1,c2,c3,c4) VALUES(
FLOOR(RAND()*rownum), FLOOR(RAND()*rownum), NOW(),
REPEAT(CHAR(ROUND(RAND()*255)), 200)
);
SET i = i + 1;
IF commitrate > 0 AND i % commitrate = 0 THEN
COMMIT;
END IF;
END WHILE;
COMMIT; -- 最後統一提交
END
💡 核心心法:索引是雙面刃,讀快寫慢;提交頻率是效能與併發的平衡點,**批量場景大事務,線上場景小事務**。