innodb_flush_log_at_trx_commit=0可提升导入速度3–5倍,但MySQL崩溃可能丢失最多1秒数据;电商、支付类业务严禁使用,仅适用于日志表等可容忍丢失的场景,且须配合关闭unique_checks、foreign_key_checks和sql_log_bin。

innodb_flush_log_at_trx_commit=0 是提速关键,但必须理解风险
这个参数直接控制 Redo Log 刷盘行为,默认值 1 表示每次事务提交都强制 fsync 到磁盘,安全性高但写入极慢。设为 0 后,log buffer 每秒刷一次磁盘,事务提交只写内存——实测导入速度可提升 3–5 倍。
注意:0 模式下 MySQL 崩溃可能丢失最多 1 秒数据;2 是折中方案(写 OS cache 后返回),但若 OS 崩溃仍可能丢数据。电商、支付类业务严禁用 0 或 2,日志表、临时汇总表可用。
务必使用 SET GLOBAL innodb_flush_log_at_trx_commit = 0,而不是 session 级别——某些客户端连接或存储过程会新开 session,导致优化失效。
必须关掉的三项检查:unique_checks、foreign_key_checks、sql_log_bin
这三项在导入时逐行校验或写盘,是性能硬瓶颈:
-
SET UNIQUE_CHECKS = 0:跳过唯一索引重复校验,避免每条 INSERT 都查 B+ 树 -
SET FOREIGN_KEY_CHECKS = 0:禁用外键约束检查,否则每条 INSERT 都要关联父表 -
SET sql_log_bin = 0:关闭 binlog 写入(前提是确认不需要主从同步该批数据)
导入完成后必须恢复:SET UNIQUE_CHECKS = 1、SET FOREIGN_KEY_CHECKS = 1、SET sql_log_bin = 1。漏掉任一恢复项,后续写入可能出错或不同步。
max_allowed_packet 和 bulk_insert_buffer_size 要配大
这两个参数影响单次 SQL 解析和缓冲能力:
-
max_allowed_packet默认仅 4MB,遇到大 INSERT 直接报错Packets larger than max_allowed_packet are not allowed。建议设为20971520(20MB)或更高 -
bulk_insert_buffer_size控制批量插入时的内存缓冲区,默认仅 8MB。设为33554432(32MB)可显著减少磁盘 I/O 次数
两者都支持在线修改:SET GLOBAL max_allowed_packet = 20971520、SET GLOBAL bulk_insert_buffer_size = 33554432。但要注意:如果导入脚本本身含超长语句,还得配合预处理合并 INSERT 行。
innodb_doublewrite 在 MySQL 8.0+ 必须检查是否启用
MySQL 8.0.20+ 默认强制开启 innodb_doublewrite,且双写区已独立成文件,导致每页写入多一次同步 I/O。实测导入速度比 5.7 低 20%–40%。
确认状态:SELECT @@innodb_doublewrite 返回 ON 即生效。
临时禁用(仅限可信离线环境):SET GLOBAL innodb_doublewrite = OFF。禁用后若发生断电或崩溃,可能造成页损坏,所以导入完必须立刻恢复:SET GLOBAL innodb_doublewrite = ON。
注意:该参数无法 session 级别修改,必须 global;且部分云数据库(如 RDS)不支持动态关闭,需提前确认权限。


















