Mysql查询缓存


缓存的对象:
1,sql语句
2,sql结果


参数
show variables like '%query_cache%';
query_cache_type    #是否开启0,1,2/on,off,demand  需要在my.cnf中配置并重启
have_query_cache    # 是否支持
query_cache_size    #缓存大小,字节数,建议1024整数倍
query_cache_limit   #单次缓存的最大结果集,字节数,超过的不缓存。
query_cache_min_res_unit #用来分配内存块的最小体积。默认4096字节。每次给查询结果分配的内存大小,小了节省内存,但增加内存分配频率。
query_cache_wlock_invalidate #默认情况下(off),表被lock tables命令锁住,查询也会被缓存。


常用命令:
flush query cache #整理查询缓存,不会清除缓存内容
reset query cache #移除缓存内容
show status like 'qcache%';#查询缓存状态
qcache_queries_in_cache #在缓存中已注册的查询数目
qcache_inserts #被加入到缓存中的查询数目。ps:查询缓存缓存过的总的查询结果数目
qcache_hits #缓存采样数的数目
qcache_lowmem_prunes #因为缺少内存而被从缓存中删除的查询数目
qcache_not_cached #没有被缓存的查询数据
qcache_free_memory #查询缓存的空闲内存总数
qcache_free_blocks #查询缓存中的空闲内存块的数目
qcache_total_blocks #查询缓存中块的总数目


小技巧:
1,如空闲内存块是总内存块一半左右,表明存在严重内存碎片。通常用 flush query cache 整理碎片,在用reset query cache清理查询缓存。
2,碎片很少,但命中很低,说明缓存内存空间小。此时qcache_lowmem_prunes会增加,如此值增加过快,可能原因为下:
1,如存在大量空闲块,则是因为碎片的存在而引起的。
2,空闲内存块较少,可以适当地增加缓存大小。
3,大小写不同的sql语句,被认为是不同的查询语句。不支持now(),date()等不确定因素的查询。
4,分区表在某些情况下可以提高缓存命中率,避免因为表中有一条字段变更而导致整表被清空缓存。
5,缓存查询会消耗资源(判断,存储,清除),谨慎开启。


优化技巧:
1,设计表时,避免大表。多用小表。
2,数据写入时,尽量一次写入多条数据。
3,不在库和表上加查询缓存,用sql_cache,sql_no_cache在sql添加。
4,对于保存多写入的应用程序,关闭查询缓存可改进性能。
5,禁用的时候将query_cache_size设置为0,这样不会消耗任何内存。否则虽然不启动,但还是会占用内存。
6,如想少数查询用缓存,query_cache_type 设置为 demand ,配合sql_cache完成。
7,从缓存中受益最多的查询可能是需要很多资源来产生结果,但是不需要很多空间来保存的类型。
所以用于存储、返回和失效的代价都较小。聚集查询,比如从大表中利用COUNT()产生较小的结果,就符合这个范畴。
 
参考url

http://www.jquerycn.cn/a_14480