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

MySQL INSERT 性能優化:批量插入、延遲插入、LOAD DATA、鎖表、禁用索引六大技巧

     編輯:MySQL 資料庫相關知識

MySQL 單條插入開銷含連接、解析、寫入、索引維護、提交五個階段。本文拆解插入耗時組成,給出六大優化技巧與實測效果對比。

一、單條插入耗時分解(相對單位)

  • 連接:3
  • 發送查詢:2
  • 解析查詢:2
  • 寫入記錄:1 × 記錄大小
  • 索引維護:1 × 索引數
  • 關閉:1

表大小以 N log N (B+Tree) 減慢索引插入。

二、六大優化技巧

技巧適用場景核心命令/代碼預期提升
多值 INSERT同一客戶端批量寫入INSERT INTO t (a,b) VALUES (1,2),(3,4),(5,6);比單條循環快 5-10 倍(減少解析、網絡往返)
INSERT DELAYED多客戶端寫入、可容忍延遲INSERT DELAYED INTO t ...客戶端即時返回,服務器批量刷盤(MyISAM/MEMORY 支持,InnoDB 5.6+ 忽略 DELAYED)
LOAD DATA INFILE文本文件導入、大量數據初始化LOAD DATA INFILE 'data.txt' INTO TABLE t;比 INSERT 快 **20 倍**
禁用索引 + 導入 + 重建大表全量裝載、MyISAM/InnoDB1. myisamchk --keys-used=0 -rq tbl 禁用索引
2. LOAD DATA INFILE
3. myisamchk -r -q tbl 重建索引(內存排序、避免隨機 IO)
索引維護從 O(N log N) 降為 O(N) 掃描排序
鎖表批量提交單客戶端大批量、可獨佔表LOCK TABLES t WRITE; INSERT ...; INSERT ...; UNLOCK TABLES;索引緩衝區僅刷盤一次,整體提速 ~40%
MyISAM 並發插入無刪除空洞的 MyISAM 表無需額外操作,concurrent_insert=1 (默認)SELECT 與 INSERT 並行無阻塞

三、LOAD DATA 深度優化流程(官方推薦)

  1. CREATE TABLE t ...(僅結構,無索引)
  2. FLUSH TABLES
  3. myisamchk --keys-used=0 -rq /path/to/t 禁用索引
  4. LOAD DATA INFILE 'data.txt' INTO TABLE t 极速寫入
  5. myisampack /path/to/t (可選,壓縮只讀表)
  6. myisamchk -r -q /path/to/t 重建索引(內存構建 B-Tree,避免磁盤尋道)
  7. FLUSH TABLES

此流程將被未來版本整合進 LOAD DATA INFILE 內部。

四、InnoDB 專用優化

  • innodb_flush_log_at_trx_commit = 2(導入期間臨時調整,風險秒級丟失 1 秒數據)
  • innodb_autoinc_lock_mode = 2(interleaved 模式,配合多值 INSERT 最大化自增並發)
  • 禁用外鍵檢查:SET FOREIGN_KEY_CHECKS=0; 導入後 =1
  • 禁用唯一檢查:SET UNIQUE_CHECKS=0; 導入後 =1
  • 使用 LOAD DATA INFILE(InnoDB 同樣受益於批量、減少解析)

五、實戰建議

  • 日常業務寫入:優先 **多值 INSERT**(batchSize=1000-5000),框架層面自動批量(Hibernate hibernate.jdbc.batch_size、MyBatis BATCH 模式)。
  • 大數據初始化/遷移:**LOAD DATA INFILE + 禁用索引重建**。
  • 日誌/監控類高寫入:考慮 **分區表 + 批量 INSERT** 或 **ClickHouse/時序庫** 卸載。

插入優化核心:**減少解析往返、批量緩衝刷盤、延遲索引維護**。根據數據量、業務容忍度、存儲引擎選擇組合拳。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved