query cache的存储方式

阅读更多
当查询进行时,如果设置了query cache,MySQL会把查询的结果保存在qc中。保存并不是在结果集完全得到的时候进行的,而是一边检索一边保存,MySQL每次会分配一块大小为query_cache_min_res_unit的内存用于保存结果集,当使用完之后再分配一块,所以如果结果集大于query_cache_min_res_unit会使得在一次查询中进行多次内存的分配。

当最后一块分配的内存没有完全使用时,MySQL会把这块内存截断,并把没有使用的那部分归还以重复利用。但是当多个query同时进行时,可能归还的部分无法和空余的内存合成连续的块而造成这部分大小小于query_cache_min_res_unit无法再分配,这样出现了无法再使用的内存碎片。一个连续的同一类型的内存块称为block,包含使用的块,也包含未使用的块。

Qcache_total_blocks 显示了所有的块数,而Qcache_free_blocks 反映了未使用的块数。如果Qcache_free_blocks很大,说明内存的碎片很多,内存的使用率会比较差,所以这时虽然Qcache_free_memory显示还有剩余的内存,也可能无法使用,当插入新的query时就需要清除旧的,使得Qcache_lowmem_prunes很高。可以使用flush query cache重整内存,操作之后Qcache_free_blocks应该为1,因为所有未使用的内存都放在一起作为连续的一块了。可以根据
query的大小调整query_cache_min_res_unit以更好地利用内存。可以使用

(query_cache_size - Qcache_free_memory)/ Qcache_queries_in_cache

计算query的平均大小。不过不是把query_cache_min_res_unit设得越小越好,因为频繁的分配内存会影响执行的速度。

我不知道一个query会使用几个block,对于一个刚使用qc,发现每加入一个query,block增加了2,但在一个运行的服务器上看到Qcache_queries_in_cache*2和Qcache_total_blocks要相差不少。

你可能感兴趣的:(Cache,MySQL)