bulk_insert_buffer_size 对 load data infile 无效,它仅作用于 myisam 的批量 sql 插入(如 insert ... select),而 load data infile 绕过 sql 层直写存储引擎,不使用该缓冲区。

bulk_insert_buffer_size 对 LOAD DATA 实际有没有用
没用。这个参数只在 MyISAM 引擎执行 BULK INSERT(比如 INSERT ... SELECT 或 REPLACE ... SELECT)时生效,而 LOAD DATA INFILE 走的是完全不同的路径 —— 它绕过 SQL 层,直接写入存储引擎的数据文件,bulk_insert_buffer_size 完全不参与。
常见误解是:既然名字带 “bulk”,那肯定管 LOAD DATA。但 MySQL 官方文档明确说明该变量仅影响 MyISAM 的批量插入优化逻辑,InnoDB 无视它,LOAD DATA 也无视它。
LOAD DATA 真正有效的调优参数有哪些
针对 LOAD DATA INFILE,真正起作用的配置项集中在 InnoDB 和 I/O 层,尤其是你用的是默认的 InnoDB 引擎(99% 的生产环境都是):
-
innodb_buffer_pool_size:必须足够大,否则大量脏页刷盘会卡住导入;建议设为物理内存的 50%–75% -
innodb_log_file_size:日志文件太小会导致频繁 checkpoint,拖慢LOAD DATA;单个日志文件至少 1G 起步(如innodb_log_file_size = 2G) -
innodb_flush_log_at_trx_commit = 2:临时设为 2(非 1),可避免每次事务都刷盘;注意:断电可能丢 1 秒数据,仅限导入阶段临时改 -
innodb_doublewrite = OFF:导入期间可关闭 doublewrite(仅限有 UPS 或能接受崩溃风险的场景) -
unique_checks = 0和foreign_key_checks = 0:在LOAD DATA前加SET unique_checks=0, foreign_key_checks=0;,导入完再开
为什么 SET GLOBAL bulk_insert_buffer_size 不报错却无效
因为它是合法的全局变量,MySQL 允许你动态设置,但它只在后续 MyISAM 的批量插入中才被读取。如果你执行了:
SET GLOBAL bulk_insert_buffer_size = 512*1024*1024;
再跑 LOAD DATA INFILE,SHOW STATUS LIKE 'Innodb_rows_inserted' 会照常增长,但观察 iostat -x 1 或 perf top 就会发现磁盘写模式、CPU 花费和之前几乎一样 —— 变量根本没进执行路径。
验证方式很简单:
- 确认引擎:
SHOW CREATE TABLE your_table;看是不是ENGINE=InnoDB - 确认操作:
LOAD DATA INFILE不走 SQL 解析器,也不触发bulk_insert_buffer分配逻辑 - 查变量作用域:
SELECT @@global.bulk_insert_buffer_size;能读出来,不代表它此刻被用了
LOAD DATA 导入慢,第一反应不该是调 bulk_insert_buffer_size
真正该先看的三件事:
- 是否启用了
slow_query_log却没关?LOAD DATA会被记录,I/O + 日志双写严重拖慢 - 目标表有没有二级索引?每插一行都要更新所有索引;导入前
DROP INDEX,导入完重建更快 - 文件是不是本地?
LOAD DATA LOCAL INFILE经网络传输 + 客户端解析,比服务端直接读/var/lib/mysql-files/xxx.csv慢 3–5 倍
bulk_insert_buffer_size 是个典型“看起来相关、实则无关”的参数,调它就像给电动车换机油 —— 动作没错,但对象错了。











