MySQL中key_buffer_size过大有什么影响

星芳酱_8395

星芳酱_8395

2026-09-06

655人浏览

原创

key_buffer_size设太大直接触发系统换页,因mysql仅向os申请内存,超可用物理内存减预留后会引发swap,导致查询延迟陡增;该参数仅对myisam有效,innodb环境下纯属浪费且挤占其他内存资源。

mysql中key_buffer_size过大有什么影响

key_buffer_size设太大直接触发系统换页

MySQL本身不管理物理内存分配,key_buffer_size只是向操作系统“申请”一块连续内存区域。一旦这个值超过可用物理内存减去系统预留(如内核、其他进程、文件系统缓存)后的余量,Linux 就会开始 swap —— 把部分内存页写入磁盘交换区。此时哪怕 SHOW STATUS LIKE 'Key%' 看起来命中率很高,实际查询延迟会陡增,因为索引块读取要等磁盘 I/O。

  • 典型现象:MySQL 响应变慢、vmstat 显示 si/so 列持续非零、dmesg 可能报 Out of memory: Kill process mysqld
  • MyISAM 表本身不缓存数据,只缓存索引;但 OS 层面仍需为数据页留出足够 page cache,否则 read() 系统调用也会卡住
  • 64 位系统虽支持 >4GB 的 key_buffer_size,但若单进程 RSS 超过 90% 物理内存,风险极高

只对 MyISAM 有效,InnoDB 场景下纯属浪费

如果你的库已全量迁移到 InnoDB(2026 年绝大多数生产环境都是),调大 key_buffer_size 不仅无效,还会挤占本该留给 innodb_buffer_pool_size 或 OS 缓存的内存。InnoDB 的数据+索引都走自己的缓冲池,key_buffer_size 对它完全透明。

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载
  • 检查是否真用 MyISAM:SELECT ENGINE, COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA NOT IN ('mysql','information_schema','performance_schema','sys') GROUP BY ENGINE; —— 若结果里没有 MyISAM,就别碰这个参数
  • 即使有少量 MyISAM 表(比如日志表、统计中间表),其索引总大小通常也就几十 MB,配个 64M128M 已足够
  • SHOW GLOBAL STATUS LIKE 'Key%'Key_reads 持续为 0,说明当前 key_buffer_size 已满足需求,再加无意义

配置错误导致值被静默忽略

key_buffer_size 是个脆弱的配置项:写错位置、单位格式不对、拼写偏差,MySQL 启动时不会报错,而是默默沿用默认值(通常是 8M16M)。你以为设了 2G,实际还是 8M,问题没解决,还误判了内存压力来源。

  • 必须放在 [mysqld] 段下,不能在 [client][mysql]
  • 单位必须大写且紧贴数字:key_buffer_size = 256M ✅,256m ❌,256 MB ❌,268435456(字节数)虽可但易读性差
  • 名字不能少下划线:key_bufferkey-buffer-size 都无效,只能是 key_buffer_size
  • 修改后必须重启 MySQL 生效,SET GLOBAL 动态设置仅对当前会话的 key cache 名称有效,不能改默认 buffer 大小

多 key_buffer 场景下容易误配

MySQL 支持创建多个命名 key buffer(如 hot_cache.key_buffer_size),但默认 buffer(即未指定名称的)始终存在且不可删除。新手常误以为“建了新 buffer 就不用管默认的”,结果两个 buffer 加起来远超物理内存。

  • 命名 buffer 必须显式用 CACHE INDEX table_name IN hot_cache 绑定表,否则索引仍走默认 buffer
  • 命名 buffer 大小设为 0 会释放内存,但默认 buffer 的 key_buffer_size 仍生效,两者不能互相抵消
  • 除非你有明确的冷热分离需求(比如高频访问的 MyISAM 表 + 低频归档表),否则没必要搞多个 buffer,维护成本高且易出错
实际调参时最常被忽略的一点:MyISAM 索引文件(.MYI)本身是静态结构,它的总大小才是硬约束。算出来是 320MB,你就配 256M,而不是看服务器有 64GB 内存就填 16G —— 多出来的那 15.7GB 不会产生任何收益,只会让系统更脆。

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

1913

6

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.21

1179

5

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

695

5

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.19

2472

5

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.25

4008

4

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.08

959

3

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.11

4291

4

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

2023.08.14

3902

7

mysql事务隔离级别
mysql事务隔离级别

mysql规范中定义了四种事务隔离级别,不同的隔离级别对事务的处理有所不同。本专题为大家提供mysql事务隔离级别相关的文章内容,大家可以免费体验。

2023.08.16

4994

11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 169人学习

使用phpenv集成环境安装极致CMS
使用phpenv集成环境安装极致CMS

共2课时 | 271人学习