MySQL的INNODB引擎性能优化总结二
在https://www.roamway.com/?p=421中我们分析了mysql性能优化前半部分,今天接着分析后半部分。
9.查询缓存(查询缓存): 通过执行show global status like ‘qcache%’; 可以得到查询缓存的情况,如下:
如果这些项目的值都为0
说明配置文件中没有设置查询缓存,请打开配置文件,然后在[mysqld]字段中配置
query_cache_type = 1
query_cache_size = x
(1表示启用查询缓存,0表示关闭查询缓存),保存退出,重启mysql.
再次执行show global status like ‘qcache%’; 可以看到各项指标有值了。
分析: 如果Qcache_lowmem_prunes的值很大,且free_memory很小,说明查询缓存内存不足,需要
增加query_cache_size的值,如32M,64M或128M等,根据需求而定。 如果Qcache_lowmem_prunes的
值很大,free_blocks也不小,且free_memory很充足,说明碎片太多,执行FLUSH QUERY CACHE 会
对缓存中的碎片进行整理。
总之,要将Qcache_lowmem_prunes维持在0或一个非常小的值。
通过以下几个值可以得知查询缓存的健康状况.
缓存碎片率
Qcache_free_blocks / Qcache_total_blocks * 100%< 20%
缓存利用率
(query_cache_size – Qcache_free_memory) / 查询缓存大小 * 100%越高越好
缓存命中率
(Qcache_hits – Qcache_inserts) / Qcache_hits * 100% 越高越好
10.Innodb_buffer_pool 命中率:执行show status like ‘Innodb_buffer_pool_%’;
计算缓冲池命中率,命中率要大于99.9%
innodb_buffer_read_hits = (1 – innodb_buffer_pool_reads /
innodb_buffer_pool_read_requests) * 100%
如果发现innodb_buffer_pool_pages_free 为0,或者innodb_buffer_pool_pages_free占
innodb_buffer_pool_pages_total的比例太小(比如不到30%),就必须增加
innodb_buffer_pool_size的值。
11.表扫描率:执行show global status like ‘handler_read%’;和
显示全局状态,如“com_select”;
如果表扫描率 = Handler_read_rnd_next / Com_select的值大于4000
说明执行了太多的表扫描,有可能索引没有建好,增加read_buffer_size
值会有一些好处,比如2M,4M等,但最好不要超过8MB ,另外需要检查sql语句,
做好适当调整。
12.慢查询:执行show variables like ‘%slow%’;
可以看到慢查询日志功能是否开启,如果开启还能看到具体路径。
执行显示全局状态,如‘%slow%’; 显示执行了多少次慢查询,通过慢查询日志,
可以知道哪些SQL语句有问题。