如何对查询缓存进行维护和调优

0
回复
335
查看
[复制链接]
发表于 2013-12-31 23:57:51 | 显示全部楼层 |阅读模式
核心提示:
     一旦了解查询缓存的工作机制,对它进行调优就是一件容易的工作。它只有几个"活动部分"。 Query_cache_type      这个选项表示缓存是否被激活。具体选项是OFF、ON或DEMAND。DEMAND的意思是只有包含了SQL_CACHE
     一旦了解查询缓存的工作机制,对它进行调优就是一件容易的工作。它只有几个"活动部分"。
Query_cache_type
     这个选项表示缓存是否被激活。具体选项是OFF、ON或DEMAND。DEMAND的意思是只有包含了SQL_CACHE选项的查询才能被缓存。它既是会话级变量,也是全局性变量(更多关于会话变量和全局变量的话题请参阅第6章)。
Query_cache_size
        分配给查询的总内存,以字节为单位。它必须是1024的倍数。所以MySQL实际使用的值可能和定义的值稍有不同。
Query_cache_min_res_unit
      分配缓存块的最小值。第206页的"缓存如何使用计算机内存"解释过该设置,下节会对它做进一步讨论。Query_cache_limit
       这个选项限制了MySQL存储的最大结果。如果查询的结果比这个值大,那么就不会被缓存。要知道的是服务器在产生结果的同时进行缓存,它无法预先知道结果是否会超过这一限制。如果在缓存的过程中发现已经超过了限制,MySQL会增加Qcache_not_cached的值,并且丢掉已经缓存过的值。如果知道会发生这样的事,那么给查询加上SQL_NO_CACHE,可以避免这种开销。

Query_cache_wlock_invalidate
       这个选项指是否缓存其他联接已经锁定了的表。默认值是OFF,可以让你从其他联接已经锁定了的表中读取缓存过的数据,这改变了服务器的语义。因为这种读取通常是不被允许的。把它改成ON会阻止读取数据,但有可能增加锁等待。它对于大多数程序都没有影响,所以通常保持默认值就可以了。
在原则上,对电脑缓存进行调优很简单,但是理解自己所做的改变的影响则要复杂得多。接下来的章节展示了如何对查询缓存进行推理,以做出正确的决定。
减少碎片
     没有办法避免所有的碎片,但是仔细地选择query_cache_min_res_unit可以避免在查询缓存中造成大量的内存浪费。关键在于每一个新块和服务器已分配给存储结果的块的数量之间找到平衡。如果值过小,服务器将会浪费较少的内存,但会更频繁地分配块,这对服务器意味着更多的工作。如果值过大,碎片将会很多。合适的折中是在浪费内存和增加CPU处理时间上取得平衡。
     最佳设置根据典型查询结果而定。可以用使用的内存(大致等于query_cach_size-Qcache_ free_memory)除以Qcache_queries_in_cache得到查询的平均大小。如果缓存由大结果和小结果混合而成,那么就很难找到一个合适的大小,既能避免碎片,也能避免过多的内存分配。但是,有理由相信缓存大结果没有太大的益处(这通常是真的)。可以通过降低query_cache_limit的值阻止缓存大结果,它有时有助于在碎片和在缓存中保存结果的开销中得到平衡。计算机基础知识试题
     可以通过检查Qcache_free_blocks的值来探测缓存中碎片的情况,它可以显示缓存中有多少内存块处于FREE状态。图5-2中最后一步显示了两个处于FREE的块。碎片最严重的情况就是在每两个存储了数据的块之间都有一个比最小值稍小的可用块。这样的话,每隔一个存储块就有一个自由块。因此,如果Qcache_free_blocks大致等于Qcache_total_ blocks/2,则说明碎片非常严重。如果Qcache_lowmem_prunes的值正在增加,并且有大量的自由块,这意味着碎片导致查询正被从缓存中永久删除。
      可以使用FLUSH QUERY CACHE命令移除碎片。这个命令会把所有的存储块向上移动,并把自由块移到底部。当它运行的时候,它会阻止访问查询缓存,这锁定了整个服务器。但它通常都很快,除非缓存非常大。和名字相反,它不会从缓存中移除查询,RESET QUERY CACHE才会这么做。
提高查询缓存的可用性
      如果缓存没有碎片,但是命中率却不高,那么就应该给缓存分配较少的内存。如果服务器找不到足够大小的块来存储结果,那么就应该从缓存中清理掉一些查询。
当服务器清理查询的时候,Qcache_lowmem_prunes的值会增加。如果它的值增加得很快,那么可能有两个原因:
如果有很多自由块,那么问题可能是由碎片引起的(参阅前一节)。
如果自由块比较少,那么这可能意味着工作负载使用的内存大小超过了所分配的内存。可以检查Qcache_free_memory知道未使用的内存数量。http://www.woaidiannao.com
        如果有很多自由块,碎片很少,由于内存不足引起的清理工作也很少,但是命中率仍然不高,这说明工作负载也许不能从缓存中受益。肯定有什么东西阻止查询使用缓存,很多update语句可能是原因,另外一个可能的原因是查询是不可缓存的。
     如果已经估算过缓存命中率,但是还不确定服务器是否从缓存中受益,此时可以禁用缓存并且监控性能,然后重新开启缓存并观察性能变化。为了禁用缓存,可以将query_cache_size设置为0(改变query_cache_type不会从全局上影响已经打开了的连接,而且不会把内存归还给服务器)。也可以做基准测试,但是有时候很难得到包含了可缓存的查询、不可缓存的查询,以及更新语句的测试样例。
图5-3用一个基本例子显示了分析和调整查询缓存的流程。
498)this.style.width=498;" border=0>

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?投稿

x
关注官方微信

微信号:大白网

微博:大白网

QQ1群:4731622

QQ2群:4731622

全国服务热线:

QQ24485416

(工作日:周一至周五 9:00-16:00)
大理市
www@dali8.net

手机版-小黑屋- 大理白族|大理乡村旅游网|大理网|大理论坛|白族网|大理旅游网|大理信息网|大理生活网

技术支持:挖主机网络 Powered by大白网© 2006-2025 dalibaizu.com  滇ICP备19004088号 滇公网安备 53290102000530号