也看Key_buffer_size参数设置
在mysql数据库中,mysql key_buffer_size是对MyISAM表性能影响最大的一个参数(注意该参数对其他类型的表设置无效),下面就将对mysql Key_buffer_size参数的设置进行详细介绍下面为一台以MyISAM为主要存储引擎服务器的配置:
1mysql> show variables like 'key_buffer_size';
2+-----------------+------------+
3| Variable_name | Value |
4+-----------------+------------+
5| key_buffer_size | 536870912 |
6+-----------------+------------+
分配了512MB内存给mysql key_buffer_size,我们再看一下key_buffer_size的使用情况:
1mysql> show global status like 'key_read%';
2+------------------------+-------------+
3| Variable_name | Value |
4+------------------------+-------------+
5| Key_read_requests | 27813678764 | //从缓存读取索引的请求次数。
6| Key_reads | 6798830 | //从磁盘读取索引的请求次数。
7+------------------------+-------------+
一共有27813678764个索引读取请求,有6798830个请求在内存中没有找到直接从硬盘读取索引,计算索引未命中缓存的概率:
1key_cache_miss_rate = Key_reads / Key_read_requests * 100%
比如上面的数据,key_cache_miss_rate为0.0244%,4000个索引读取请求才有一个直接读硬盘,已经很BT了,key_cache_miss_rate在0.1%以下都很好(每1000个请求有一个直接读硬盘),所以理论来上来说,这个比值越小越好,但过小的话,难免造成内存浪费。
以上两个值的比率固然能一部分的说明key_buffer_size是否合理,但仅仅以此就说明该值设置的合理的话,就过于偏激和片面了。因为这里忽略了两个问题:
1、比例并不显示数量的绝对值大小
2、计数器并没有考虑时间因素
虽说Key_read_requests大比小好,但是对于系统调优而言,更有意义的应该是单位时间内的Key_reads,即:Key_reads / Uptime
具体查看方法如下:
1[root@web20 mysql]# mysqladmin ext -uroot -p -ri10 | grep Key_reads
2Enter password:
3| Key_reads | 279225 |
4| Key_reads | 116 |
5| Key_reads | 294 |
6| Key_reads | 255 |
7| Key_reads | 259 |
8| Key_reads | 342 |
9| Key_reads | 541 |
10| Key_reads | 733 |
11| Key_reads | 387 |
12| Key_reads | 583 |
注:命令里的mysqladmin ext其实就是mysqladmin extended-status,你甚至可以简写成mysqladmin e。
其中第一行表示的是汇总数值,所以这里不必考虑,下面的每行数值都表示10秒内的数据变化,从这份数据可以看出每10秒系统大约会出现500次Key_reads访问,折合到每1秒就是50次左右,至于这个数值到底合理与否,就由服务器的磁盘能力而定了。(注:我这里之所以数据变化较大,是因为有update等语句造成了表锁而导致下个时间段内的查询数猛增。)
为啥数据按10秒取样,而不是直接按1秒取样?由于时间段过小,数据变化比较剧烈,不容易直观估计大小,所以通常数据按照10秒或者60秒之类的时间段来取样是更好的。
以上部分主要参考了mysql performance blog的一篇博客。
除些之外,我们还可以参考下key_blocks_*参数:
1mysql> show global status like 'key_blocks_u%';
2+------------------------+-------------+
3| Variable_name | Value |
4+------------------------+-------------+
5| Key_blocks_unused | 0 |
6| Key_blocks_used | 413543 |
7+------------------------+-------------+
Key_blocks_unused表示未使用的缓存簇(blocks)数,Key_blocks_used表示曾经用到的最大的blocks数,比如这台服务器,所有的缓存都用到了,要么增加key_buffer_size,要么就是过渡索引了,把缓存占满了。比较理想的设置:
Key_blocks_used / (Key_blocks_unused + Key_blocks_used) * 100% ≈ 80%
捐赠本站(Donate)
如您感觉文章有用,可扫码捐赠本站!(If the article useful, you can scan the QR code to donate))
- Author: shisekong
- Link: https://blog.361way.com/mysql-key_buffer_size/2517.html
- License: This work is under a 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. Kindly fulfill the requirements of the aforementioned License when adapting or creating a derivative of this work.