MySQL设置查询缓存的用意:mysql
把查询到的结果缓存起来,下次再执行相同查询时就能够直接从结果集中取;这样就比从新查一遍要快的多。sql
查询缓存的最终结果是事与愿违:缓存
之因此查询缓存并无能起到提高性能的作用,客观上有以下两点缘由并发
一、把SQL语句的hash值做为键,SQL语句的结果集做为值;这样就引发了一个问题如 select user from mysql.user 和 SELECT user FROM mysql.user 性能
这两个将会被当成不一样的SQL语句,这个时候就算结果集已经有了,可是一然用不到。rest
二、当查询所基于的低层表有改动时与这个表有关的查询缓存都会做废、若是对于并发度比较大的系统这个开销是可观的;对于做废结果集这个操做也是要用并发server
访问控制的,就是说也会有锁。并发大的时候就会有Waiting for query cache lock 产生。内存
三、至于用不用仍是要看业务模型的。hash
若是何配置查询缓存:it
query_cache_type 这个系统变量控制着查询缓存工能的开启的关闭。
query_cache_type=0时表示关闭,1时表示打开,2表示只要select 中明确指定SQL_CACHE才缓存。
这个参数的设置有点奇怪,一、若是事先查询缓存是关闭的然而用 set @@global.query_cache_type=1; 会报错
ERROR 1651 (HY000): Query cache is disabled; restart the server with query_cache_type=1 to enable it
二、若是事先是打开着的尝试去闭关它,那么这个关闭也是不彻底的,这种状况下查询仍是会去尝试查找缓存。
最好的关闭查询缓存的办法就是把my.cnf 中的query_cache_type=0而后再重启mysql。
查询缓存相关的系统变量:
have_query_cache 表示这个mysql版本是否支持查询缓存。
query_cache_limit 表示单个结果集所被容许缓存的最大值。
query_cache_min_res_unit 每一个被缓存的结果集要占用的最小内存。
query_cache_size 用于查询缓存的内存大小。
如何监控查询缓存的命中率:
Qcache_free_memory 查询缓存目前剩余空间大小。
Qcache_hits 查询缓存的命中次数。
Qcache_inserts 查询缓存插入的次数。
也就是说缓存的命中率为 Qcache_hits/(Qcache_hits+Qcache_inserts)