若谷学院
互联网公司技术架构分享

5.MySQL Query Cache性能优化FAQ

1.如何检查MySQL数据库是否开启query cache 

mysql> show variables like ‘%query_cache%’;  
 

2.如何开启Query Cache?

MySQL配置文件中开启query cache,  vim /etc/mysql/my.cnf
query_cache_size=256M
query_cache_type=1
 
Query Cache缓存的是对于搜索条件的整个结果集,在数据更新时会自动失效,官方建议Query Cache Size的大小设置一般不要超过256MB。
 
query_cache_type参数用于控制缓存的类型,注意这个值不能随便设置,必须设置为数字,可选项目以及说明如下:
选项
含义
0
关闭,不缓存/重新取得结果。禁用Quer yCache
1
开启,缓存所有结果,除非select语句使用SQL_NO_CACHE禁用了查询缓存
2
只缓存在select语句中通过SQL_CACHE指定需要缓存的查询
 

3.如何设置query_cache_type?

query_cache_type的策略建议:
 
可以开启1, 然后对于insert, update频繁的表操作,select语句中加上SQL_NO_CACHE,比如订单量的记录表,页面访问量的记录表。如查询帖子的访问量:
select sql_no_cache * from wp_postmeta where meta_key=’views’
 
可以开启2,然后对于更新慢,查询多的表Select操作时,使用SQL_CACHE选项,比如博客网站的帖子表,由于不是每时每刻都更新,使用Query Cache的效果会很好,可以使用SQL_CACHE选项,如查询前20的帖子:
select sql_cache * from  wp_posts limit 20
 

4.如何计算Cache命中率?

可以通过Qcache相关变量来查看Query Cache的状态,然后手工计算命中率。
mysql> show status like ‘Qcache%’ ;
    Qcache_free_blocks:目前还处于空闲状态的 Query Cache 中内存 Block 数目
    Qcache_free_memory:目前还处于空闲状态的 Query Cache 内存总量
    Qcache_hits:Query Cache 命中次数
    Qcache_inserts:向Query Cache 中插入新的 Query Cache 的次数,也就是没有命中的次数
    Qcache_lowmem_prunes:Query Cache 因为内存不够,而从中删除老的Query Cache的次数。
    Qcache_not_cached:没有被 Cache 的 SQL 数,包括无法被 Cache 的 SQL 以及由于 query_cache_type 设置的不会被 Cache 的 SQL
    Qcache_queries_in_cache:目前在 Query Cache 中的 SQL 数量
    Qcache_total_blocks:Query Cache 中总的 Block 数量
命中率的计算:
    Query Cache 命中率= Qcache_hits/(Qcache_hits+Qcache_inserts); 
 

5.如何判断使用Query Cache的效果?

粗放来看,query cache 是否有效,一可以看命中率是否高于70%,二看MySQL Slow Query是否减少,三是从应用的效果来看,看整个页面的响应时间有没有变快,比如查看 nginx的access log,统计一段时间内的请求平均响应时间是否大幅减少。
 

6.如何判断一条SQL语句是否命中了Query Cache?

可以在运行这条SQL语句前后,分别运行如下语句,查看 Qcache_hits的值是否有增加,每次命中这个值会加1。如果没有命中Qcache_inserts的数量加1。
mysql>   show status like ‘Qcache%’ ;
如图,两次执行期间Qcache_hits数没有变化, Qcache_inserts的值增加了1,说明这条SQL没有命中Query Cache。
Query Cache Hits

 

全球互联网技术架构,前沿架构参考

联系我们博客/网站内容提交