拨乱反正:MyISAM中key_buffer_size的设置

本文指出传统的Key_read_requests/Key_reads比率并非MySQL key_buffer_size调整的最佳指标。正确的做法是关注Key_reads与服务器运行时间(Uptime)的比率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作者:老王

一直以来,多数人在使用MyISAM时都是按照增大Key_read_requests / Key_reads的原则来设置key_buffer_size的,没想到这竟然是错误的!这次给大家醍醐灌顶的仍然是MySQL Performance Blog,详细描述参考:Why you should ignore MySQL’s key cache hit ratio。

Key_read_requests和Key_reads就是两个计数器,它们的含义如下:

Key_read_requests:从缓存读取索引的请求次数。

Key_reads:从磁盘读取索引的请求次数。

通常人们认为Key_read_requests / Key_reads越大越好,否则就应该增大key_buffer_size的设置,但通过计数器的比例来调优有两个问题:

问题一:比例并不显示数量的绝对值大小

问题二:计数器并没有考虑时间因素

虽说Key_read_requests大比小好,但是对于系统调优而言,更有意义的应该是单位时间内的Key_reads:

Key_reads / Uptime

你可以通过命令行得到一个实时的数据结果,比如:

# mysqladmin ext -ri10 | grep Key_reads

| Key_reads | 83777189 |

| Key_reads | 211 |

| Key_reads | 177 |

| Key_reads | 202 |

提示:命令里的mysqladmin ext其实就是mysqladmin extended-status,你甚至可以简写成mysqladmin e。

其中第一行表示的是汇总数值,所以这里不必考虑,下面的每行数值都表示10秒内的数据变化,从这份数据可以看出每10秒系统大约会出现200次Key_reads访问,折合到每1秒就是20次左右,至于这个数值到底合理与否,就由服务器的磁盘能力而定了。

顺便说一句,为啥数据按10秒取样,而不是直接按1秒取样?这里看看按1秒的结果:

# mysqladmin ext -ri1 | grep Key_reads

| Key_reads | 83776743 |

| Key_reads | 7 |

| Key_reads | 7 |

| Key_reads | 38 |

可以看到,由于时间段过小,数据变化比较剧烈,不容易直观估计大小,所以通常数据按照10秒或者60秒之类的时间段来取样是更好的。

忘记:Key_read_requests / Key_reads

牢记:Key_reads / Uptime

来源:http://hi.baidu.com/thinkinginlamp/blog/item/53592838e60b3e2fb8998ffd.html


MySQL中,key_buffer_size参数控制着MyISAM存储引擎索引块的缓存大小。优化这个参数可以显著提升对MyISAM表的读取性能。为了实现这一点,首先要确定系统中可用的物理内存,并根据实际情况合理分配。可以通过以下步骤进行设置和优化: 参考资源链接:[MySQL OCP深入学习笔记:DBA必备知识精要](https://wenku.youkuaiyun.com/doc/3a7ixh89y8?spm=1055.2569.3001.10343) 1. 查看当前的key_buffer_size值: ```sql SHOW VARIABLES LIKE 'key_buffer_size'; ``` 2. 计算并设置合适的key_buffer_size值。通常建议设置为系统内存的10%到30%,但要根据实际的服务器内存大小和用途进行调整。例如,如果你有一个8GB内存的服务器,可以考虑设置: ```sql SET GLOBAL key_buffer_size = 2G; ``` 注意,这个设置需要添加到MySQL的配置文件中,如***f或my.ini,在[mysqld]部分进行设置,以保证MySQL重启后仍能生效。 3. 使用key_buffer_size的最佳实践还包括确保操作系统有足够的内存用于其他操作,以避免内存交换(swap)的发生。 4. 监控key_buffer_size的性能效果,使用SHOW STATUS查看Key_read_requests和Key_read命中率: ```sql SHOW STATUS LIKE 'Key_read%'; ``` 5. 如果Key_read_ratio(Key_read_requests / Key_reads)较低,说明缓存效果不佳,需要调整key_buffer_size或优化查询。 6. 如果Key_read_ratio很高,说明缓存效果良好,key_buffer_size可能已经足够。 请注意,key_buffer_size参数只影响MyISAM表,InnoDB表使用innodb_buffer_pool_size参数来缓存数据和索引。因此,对于混合使用两种存储引擎的数据库,需要同时调整这两个参数以达到最佳性能。 对于想要更深入了解MySQL性能优化和配置的用户,建议查阅《MySQL OCP深入学习笔记:DBA必备知识精要》,其中提供了详细的学习笔记和实践案例,帮助读者全面掌握MySQL数据库管理的核心技能。 参考资源链接:[MySQL OCP深入学习笔记:DBA必备知识精要](https://wenku.youkuaiyun.com/doc/3a7ixh89y8?spm=1055.2569.3001.10343)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值