query cache的存储方式

本文深入探讨MySQL中的Query Cache机制,包括其如何存储查询结果、内存分配策略及内存碎片产生的原因。此外,还提供了如何通过调整参数提高内存利用率的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当查询进行时,如果设置了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以更好地利用内存。可以使用
<verbatim>
(query_cache_size - Qcache_free_memory)/ Qcache_queries_in_cache
</verbatim>
计算query的平均大小。不过不是把query_cache_min_res_unit设得越小越好,因为频繁的分配内存会影响执行的速度。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值