全球旧事资料 分类
来避免这种开销。以查询某表(18列)中的5000条结果为例,结果集数据大小约为14M,该设置是能满足要求的,保持该值即可。但如果查询结果数据过万的情况较多的话则应适当增加该值,最大不要超过4M。
Qcache_free_memory
如果缓存由大结果和小结果混合而成,那么就很难找到一个合适的大小,既能避免碎片,也能避免过多的内存分配,但是缓存大结果没有太大的益处,可以通过降低Query_cache_limit的值阻止缓存大结果,它有时有助于在碎片和在缓存中保存结果的开销中得到平衡。Query_cache_mi
_res_u
it
fQcache_free_blocks
Qcache_total_blocks
Qcache_lowme
_pru
es
可以通过检查Qcache_free_blocks的值来观察缓存中碎片的情况,它可以显示缓存中有多少内存块处于空闲状态。碎片最严重的情况就是在每两个存储了数据的块之间都有一个比最小值稍小的可用块,这样每隔一个存储块就有一个自由块,因此,如果Qcache_free_blocks大致等于Qcache_total_blocks2,则说明碎片非常严重。Qcache_lowmem_pru
es表示由于缓存内存不足被清除出查询缓存的条数,如果Qcache_lowmem_pru
es的值正在增加,并且有大量的自由块,就说明碎片导致查询正被从缓存中永久删除。查询缓存碎片率Qcache_free_blocksQcache_total_blocks100
如果查询缓存碎片率超过20,可以用FLUSHQUERYCACHE整理缓存碎片,或者试试减小query_cache_mi
_res_u
it,如果你的查询都是小数据量的话。使用FLUSHQUERYCACHE命令移除碎片,该命令会把所有的存储块向上移动,并把自由块移到底部。当它运行的时候,会阻止访问查询缓存,这会锁定整个服务
f器,但它通常会很快,除非缓存特别大。如果缓存没有碎片,但是命中率却不高,那么就应该给缓存分配较少的内存,如果服务器找不到足够大小的块来存储结果,就应该从缓存中清理掉一些查询,可以使用RESETQUERYCACHE命令从缓存中移除查询。当服务器清理查询的时候,Qcache_lowme
_pru
es值会增加,如果它的值增加得很快,可能有两个原因:1)如果有很多自由块,就可能是有碎片引起的;2)如果自由块比较少,就可能表示工作负载使用的内存大小超过了所分配的内存,可以检查Qcache_free_memory知道为使用的内存数量。如果有很多自由块,碎片很少,由于内存不足引起的清理工作也很少,但命中率仍然不高,这说明工作负载也许不能从缓存中受益,一定有什么阻止了查询使用缓存,很多update语句可能会是原因,另一个原因可能是查询是不可缓存的。查询缓存分配的最小块的大小Query_cache_mi
_res_u
it为4MB。当查询进行的时候,MySQL把查询结果保存在查r
好听全球资料 返回顶部