首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 索引與提交頻率對 InnoDB 寫入速度影響實測:自增主鍵提升 3%,批次提交快 5 倍

     編輯:MySQL 資料庫相關知識

實測索引策略與提交頻率對 InnoDB 批量寫入(30 萬行)的影響,得出明確量化結論指導實務優化。

測試環境

  • 表結構:id INT AUTO_INCREMENT PRIMARY KEY, c1 INT, c2 INT, c3 TIMESTAMP, c4 VARCHAR(200)
  • 存儲過程 insert_mytab(rownum, commitrate) 控制提交頻率。
  • 每次測試前重啟實例,冷啟動狀態。

結論一:索引對寫入速度影響

索引配置相對無索引基準
無索引基準 (100%)
自增主鍵+3.11%(更快)
自增主鍵 + 二級索引-27.37%(較慢)

建議:InnoDB 表必須有自增主鍵,順序寫入減少頁分裂,提升寫入效能;二級索引按查詢需求最小化建立。

結論二:提交頻率影響(自增主鍵表,30 萬行)

提交頻率相對一次性提交耗時倍數
一次性提交 (commitrate=0)基準1.00x
每 10 萬行-1.17%1.01x
每 1 萬行-3.01%1.03x
每 1 千行-23.38%1.30x
每 100 行-24.44%1.32x
每 10 行-92.78%13.9x
每 1 行-546.78%6.47x

提交頻率耗時對比圖

核心解讀

  • 批次提交極其關鍵:每行提交比一次性提交慢 5.5 倍,主要開銷在 Redo Log 刷盤(innodb_flush_log_at_trx_commit=1 預設每提交 fsync)。
  • mysqldump --extended-insert 產生批次 INSERT,比單行 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;

此實測數據為容量規劃與架構決策提供量化依據。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
場景提交策略
高併發線上業務盡快提交,縮短鎖持有時間,避免大事務阻塞
離線/批量資料導入大批次提交(1萬-10萬行/次),或關閉 autocommit 手動控制
混合負載業務事務小批次提交,導入任務大批次提交,隔離連線池