bulk_insert_buffer_size 仅对 myisam 生效,用于批量写入索引键时的缓冲,需配合 disable keys 且为会话级变量;innodb 完全忽略该参数,应关注 innodb_buffer_pool_size 等相关配置。

bulk_insert_buffer_size 不是优化器选不选的问题——它压根就不参与查询优化器的决策流程。
MySQL 查询优化器只管“怎么执行 SQL”,比如走哪个索引、用哪种 JOIN 算法、是否下推条件。而 bulk_insert_buffer_size 是一个存储引擎层的写入缓冲区配置,仅在 MyISAM 引擎执行特定操作(如 INSERT ... SELECT、LOAD DATA INFILE 或多值 INSERT)时由引擎内部自动启用,和优化器完全无关。
你看到“没生效”,大概率是因为:
- 你的表是 InnoDB(MySQL 5.5+ 默认引擎),而
bulk_insert_buffer_size对 InnoDB 完全无效 - 你没配合
DISABLE KEYS(MyISAM 场景下必须配,否则缓冲区不触发) - 你用的是单条语句拼接的多值
INSERT,但数据量太小(
bulk_insert_buffer_size 的实际作用边界很窄:
- ✅ 只对 MyISAM 生效(InnoDB 忽略该参数)
- ✅ 仅在批量写入键值(index keys)阶段起作用,不是给数据行缓存用的
- ✅ 必须搭配
ALTER TABLE ... DISABLE KEYS才能绕过逐行索引更新,否则缓冲区形同虚设 - ✅ 是会话级变量,
SET SESSION bulk_insert_buffer_size = 67108864才可能见效
InnoDB 用户真正该盯住的参数是:
-
innodb_buffer_pool_size(影响页加载和脏页刷写) -
innodb_log_file_size(增大可减少 checkpoint 频率) -
innodb_flush_log_at_trx_commit(设为2可大幅降低刷盘压力) -
innodb_doublewrite(导入期间可临时关,但仅限可信环境)
别在 InnoDB 上调 bulk_insert_buffer_size——这不是优化器“没选对”,而是你拿错了工具。











