在mysql中,Query Cache默认是打开的,可以提高查询效率。
但这不代表开启Query Cache就对mysql的性能有所提高。因为如果有大量的修改时,由于修改造成cache失效,会给服务器造成更大的开销。
控制缓存的配置是:query_cache_type,0:关闭,1:开启,2:只有select 中明确指定SQL_CACHE才缓存。
需要注意的是Query cache对sql的大小写敏感,因为Query Cache在内存中是以Hash结构来进行映射的,而Hash算法的基础是sql语句的字符,所以任何sql语句的改变会重新cache。
缓存的生成:
- query cache内容是select的结果集
- prepared statement永远不会缓存,即使参数完全一致
- where条件中包含了某些函数永远不会缓存,如current_date, now等
- 太大的结果集(> query_cache_limit)不会被cache
缓存的更新和失效:
- 在Mysql中,可以设置Query Cache所使用的总内存(query_cache_size),MySQL会把默认可以进行缓存的SQL语句的结果集进行缓存,一旦内存塞满后,就会剔除老的Query Cache对象。
- 表数据进行任何一行的修改,基于该表相关的cache立即全部失效。为什么不做智能些?因为分析cache内容太复杂,影响性能。
缓存的使用场景:
- 当有大量的查询和大量的修改时,cache机制可能会造成性能下降。因为每次修改会导致系统去做cache失效操作,造成不小的开销。
- 系统cache的访问由一个单一的全局锁来控制,这时候大量的查询将被阻塞,直至锁释放。
指定使用缓存和不使用缓存:
-- 指定不使用缓存select SQL_NO_CACHE count() from t_user where tell = "153*******";-- 指定使用缓存select SQL_CACHE count() from t_user where tell = "153*******";
监控缓存:
使用命令:show status like ‘qcache%’;
Qcache_free_blocks:缓存中相邻内存块的个数。数目大说明可能有碎片。FLUSH QUERY CACHE会对缓存中的碎片进行整理,从而得到一个空闲块。
Qcache_free_memory:缓存中的空闲内存。
Qcache_hits:每次查询在缓存中命中时就增大
Qcache_inserts:每次插入一个查询时就增大。命中次数除以插入次数就是不中比率。
Qcache_lowmem_prunes:缓存出现内存不足并且必须要进行清理以便为更多查询提供空间的次数。这个数字最好长时间来看;如果这个 数字在不断增长,就表示可能碎片非常严重,或者内存很少。(上面的 free_blocks和free_memory可以告诉您属于哪种情况)
Qcache_not_cached:不适合进行缓存的查询的数量,通常是由于这些查询不是 SELECT 语句或者用了now()之类的函数。
Qcache_queries_in_cache:当前缓存的查询(和响应)的数量。
Qcache_total_blocks:缓存中块的数量。