mysql 查询缓存
1、查看是否开启了查询缓存功能
query_cache_type:ON表示已经开启了查询缓存功能。
query_cache_type:可设置为ON、OFF、DEMAND,分别表示已启用、已禁用、按需缓存,设置在my.cnf中即可。
have_query_cache的值为yes,表示当前数据库支持缓存功能
query_cache_limit 表示单条查询缓存的最大值,如果查询结果超过此值的大小,即使指定缓存当前结果,结果也不会被缓存,默认值为1M。
query_cache_min_res_unit表示缓存存储于内存的最小单元,默认为4k,也就是说,即使查询结果只有1k,也会占用4k内存,所以,如果此值设置的过大,会造成内存空间的浪费,如果此值设置的过小,则会频繁的分配内存单元或者频繁的回收内存单元。
query_cache_size 表示查询缓存的总大小,也就是说,内存中用于查询缓存的空间大小,如果其值为0,即使开启了查询缓存,也无法缓存。
query_cache_wlock_invalidate 表示查询缓存遭遇写锁时是否失效。默认值为OFF,表示可以从缓存返回结果,ON表示"失效",表示即使写锁,仍然从缓存获取结果。OFF时,性能更好,并发能力更好。ON时,更加安全,保证了数据的一致性。
2、只有查询语句完全相同时,缓存才能够被命中,完全相同表示大小写也相同,如下两条sql语句不算做完全相同。
因为mysql收到查询请求时,会对查询语句进行hash计算,计算出SQL语句对应的hash值,通过这个hash值来查找是否存在对应的缓存。
3、使用场景
如果某张表中的数据变化频繁,而我们在查询这张表的内容时又使用了缓存,那么缓存失效的频率将会非常高,而且计算查询语句的hash值也是需要消耗资源的,当并发查询量大时,则需要考虑这些因素。综上所述,我们往往在数据变化不频繁、且又需要重复执行相同查询的场景中使用缓存。
4、怎样灵活的使用缓存
我们可以在开启缓存的时候(query_cache_type=ON),指定对应的查询语句不使用缓存,示例如下
select sql_no_cache name from stu;
我们也可以在按需使用缓存时(query_cache_type=DEMAND),指定对应的查询语句使用缓存,示例如下
select sql_cache name from stu;
5、执行3次查询语句。查看缓存命中情况
Qcache_queries_in_cache 表示已经缓存的SQL语句的数量
Qcache_hits表示以被缓存的条目的命中次数
Qcache_inserts表示在未命中缓存时,将查询结果写入缓存的次数,当我们第一次执行查询语句时,缓存中并没有对应缓存,所以第一次查询虽然未命中,但是会将查询结果写入缓存中一份。次值可以理解为未命中缓存,但是立即生成缓存的次数。
Qcache_lowmem_prunes 表示用于查询缓存的内存区域的修剪次数,什么意思呢?此处的修剪指的是当用于缓存的内存被沾满时,mysql会使用LRU算法清除命中率低的缓存项,从而空余出部分内存空间,用于缓存新的"查询缓存",此值的数量越大,证明"修剪"的次数越多,如果短期内此值剧增,则表示我们分配的用于查询缓存的总大小偏小了,这时我们应该扩大缓存内存的值(query_cache_size的值)。
Qcache_not_cached 表示没有被缓存的查询语句的数量。
Qcache_free_memory表示查询缓存的空闲总量大小。
Qcache_free_blocks表示已分配的内存块中空闲块的数量。
Qcache_total_blocks表示当前查询缓存占用的内存的block数量。
我们可以通过上述统计信息的数值以及缓存设置相关的值,计算出查询缓存的相关指标,从而判断查询缓存是否对我们有一定的帮助,比如,通过上述数值计算出查询缓存的碎片率、缓存利用率、以及缓存命中率等信息。
查询缓存的碎片率 =(Qcache_free_blocks / Qcache_total_blocks)* 100%
查询缓存利用率 = (query_cache_size - Qcache_free_memory) / query_cache_size * 100%
查询缓存的命中率的计算需要查询出另一个参数的值,我们稍后描述,先说说上面两个。
从上述两个公式我们可以推断出,如果Qcache_free_blocks的值过大,则碎片率越高,证明我们缓存内存碎片略多,可以尝试适当的调小query_cache_min_res_unit的值,也可以使用 FLUSH QUERY CACHE语句来清理缓存碎片。
如果查询缓存利用率太低,则表示query_cache_size设置的可能过大,可适度调小,如果缓存利用率非常高,同时Qcache_lowmem_prunes的值比较大,则表示query_cache_size的值设置的略小。
如果在调整query_cache_min_res_unit时不确定该调整为多大,可以使用如下公式计算出参考值。
query_cache_min_res_unit的预估值参考计算公式: (query_cache_size - Qcache_free_memory) / Qcache_queries_in_cache
如果想要计算查询缓存的命中率,可以使用如下公式(关于缓存命中率的计算存在争议,可以根据自己的理解与实际情况进行计算):
查询缓存命中率 = (Qcache_hits / Com_select)* 100%
如果命中率长期保持较低的状态,则证明查询缓存功能对我们的帮助不是很大,我们可以考虑调整相关参数或者是关闭查询缓存功能。
之前我们已经提到过,使用 flush query cache; 可以清理查询缓存碎片。
但是flush query cache;语句并不会从缓存中移出任何缓存,如果想要清除查询缓存中已经存在的缓存,可以使用如下语句
MySQL
6、移除所有查询结果的缓存。
reset query cache
原文http://www.zsythink.net/archives/1111