您的位置:首页 > 数据库 > MySQL

mysqlc查询缓存

2016-12-01 09:25 190 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: