key_buffer_size仅影响myisam索引缓存,对innodb无效;应通过information_schema查myisam索引实际占用并设为1.2–1.5倍,避免过大导致锁竞争或内存浪费。

key_buffer_size 是给 MyISAM 表用的,InnoDB 完全不认它
很多人调大 key_buffer_size 是想加速查询,结果发现没效果——因为你的表大概率是 InnoDB 引擎。MySQL 5.5 之后默认引擎就是 InnoDB,而 key_buffer_size 只影响 MyISAM 的索引缓存,对 InnoDB 的 innodb_buffer_pool_size 零作用。
确认方法很简单:
SHOW TABLE STATUS LIKE 'your_table_name';看
Engine 字段;或者批量查:SELECT table_name, engine FROM information_schema.tables WHERE table_schema = 'your_db';
- 如果全是
InnoDB,key_buffer_size设成 8M 或 16M 就够了,再大纯属浪费内存 - 如果还有 MyISAM 表(比如老系统里的
mysql系统库部分表),才需要按实际索引大小谨慎调高 - 设得过大可能挤占其他关键内存(比如
innodb_buffer_pool_size或连接缓冲),反而拖慢整体性能
怎么查 MyISAM 索引真实占用,避免拍脑袋设值
不能看磁盘上 .MYI 文件大小,因为里面含空闲空间和碎片;得查 MySQL 内部统计的“已用索引长度”。
执行这条 SQL:
SELECT SUM(index_length) FROM information_schema.tables WHERE engine = 'MyISAM' AND table_schema NOT IN ('information_schema', 'performance_schema', 'sys');
- 结果单位是字节,除以 1024÷1024 得到 MB
-
key_buffer_size建议设为该值的 1.2–1.5 倍(留点增长余量,但别超过 2 倍) - 如果总和不到 32MB,保持默认 8M 或设成 16M 即可,没必要动
- 注意:这个值会随数据变更缓慢增长,不用天天重算,三个月左右看一次足够
my.cnf 里改完不生效?检查这三处硬伤
改了 key_buffer_size 重启 mysqld 还是没变,常见卡点就这几个:
- 配置写在错误 section 下——必须放在
[mysqld]段里,写在[client]或[mysql]下完全无效 - 单位写错:
key_buffer_size = 256M✅,key_buffer_size = 256MB❌(MySQL 不认B) - 被运行时动态覆盖:某些云数据库(如阿里云 RDS、腾讯云 CDB)禁用该参数,或只允许在控制台调整,直接改配置文件会被忽略
验证是否生效:
mysql -e "SHOW VARIABLES LIKE 'key_buffer_size';"看输出值是否和你配的一致。
并发高时 key_buffer_size 太大会反向拖慢响应
MyISAM 的键缓存是全局共享、单锁保护的。当 key_buffer_size 设得过大(比如 >512MB),每次缓存淘汰或刷脏页的锁竞争会变明显,尤其在大量 INSERT/UPDATE 混合场景下,Waiting for table flush 等待会增多。
- 线上 MyISAM 表写入频繁?宁可让部分索引走磁盘,也别盲目堆大
key_buffer_size - 观察
Key_reads / Key_read_requests比值,持续高于 0.01 才说明缓存命中差,值得优化;低于 0.001 就别碰了 - 如果业务已稳定用 InnoDB,连 MyISAM 表都快没了,
key_buffer_size真的只是个历史兼容项
真正该盯的是 innodb_buffer_pool_size 和它的命中率,那才是现代 MySQL 的性能命门。











