与朋友或同事谈到mysql查询缓存功能的时候,个人喜欢把Query Cache比作荔枝,是非常营养的东西,但是一次性吃太多了,就容易导致上火而流鼻血,虽然不是特别恰当的比喻,但是有很多相似的地方,另外Query Cache有其特殊的业务场景,也不像其他数据库产品,缓存查询语句的执行计划等信息,而是直接缓存查询语句的记录集和对应的SQL语句。本文就给大家介绍下查询缓存的相关知识,希望可以引导大家正确地使用Query Cache这个独门武器。
对mysql查询缓存从五个角度进行详细的分析:Query Cache的工作原理、如何配置、如何维护、如何判断查询缓存的性能、适合的业务场景分析。
n
查询缓存的工作原理,基本上可以用二句话概括:
l
l
查询缓存对什么样的查询语句,无法缓存其记录集,大致有以下几类:
l
l
l
l
l
l
l
l
l
l
l
查询缓存的优缺点:
l
l
l
n
l
值域为:0 -– 不启用查询缓存;
值域为:1 -– 启用查询缓存,只要符合查询缓存的要求,客户端的查询语句和记录集斗可以缓存起来,共其他客户端使用;
值域为:2 -– 启用查询缓存,只要查询语句中添加了参数:SQL_CACHE,且符合查询缓存的要求,客户端的查询语句和记录集,则可以缓存起来,共其他客户端使用;
l
允许设置query_cache_size的值最小为40K,对于最大值则可以几乎认为无限制,实际生产环境的应用经验告诉我们,该值并不是越大,查询缓存的命中率就越高,也不是对服务器负载下降贡献大,反而可能抵消其带来的好处,甚至增加服务器的负载,至于该如何设置,下面的章节讲述,推荐设置为:64M;
l
限制查询缓存区最大能缓存的查询记录集,可以避免一个大的查询记录集占去大量的内存区域,而且往往小查询记录集是最有效的缓存记录集,默认设置为1M,建议修改为16k~1024k之间的值域,不过最重要的是根据自己应用的实际情况进行分析、预估来设置;
l
设置查询缓存分配内存的最小单位,要适当地设置此参数,可以做到为减少内存块的申请和分配次数,但是设置过大可能导致内存碎片数值上升。默认值为4K,建议设置为1k~16K
l
该参数主要涉及MyISAM引擎,若一个客户端对某表加了写锁,其他客户端发起的查询请求,且查询语句有对应的查询缓存记录,是否允许直接读取查询缓存的记录集信息,还是等待写锁的释放。默认设置为0,也即允许;
n
l
l
那些操作操作可能触发查询缓存,把所有缓存的信息清空,以避免触发或需要的时候,知道如何做,二类可触发查询缓存数据全部清空的命令:
(1).
(2).
n
l
查询缓存内存碎片率=Qcache_free_blocks / Qcache_total_blocks * 100%
l
查询缓存命中率=Qcache_hits/(Qcache_hits + Qcache_inserts)
l
查询缓存内存使用率=(query_cache_size – Qcache_free_memory) / query_cache_size * 100%
l
该参数值对于检测查询缓存区的内存大小设置是否,有非常关键性的作用,其代表的意义为:查询缓存去因内存不足而不得不从查询缓存区删除的查询缓存信息,删除算法为LRU;
l
查询缓存最小内存块 = (query_cache_size – Qcache_free_memory) / Qcache_queries_in_cache
l
我们如何判断query_cache_size是否设置过小,依然也只有先预设置一个值,推荐为:32M~128M之间的区域,待系统平稳运行一个时间段(至少1周),并且观察这周内的相关状态值:
(1).
(2).
(3).
n
通过上述的知识梳理和分析,我们至少知道查询缓存的以下几点:
l
l
l
l
l
l
l
l
转自: