MySQL数据库优化之查询缓存(Query cache)

本文探讨了MySQL的查询缓存机制,包括缓存的工作原理、何时失效以及如何配置和监控。当query_cache_type设为1,MySQL会保存查询语句和结果到hash表。缓存非持久化,重启后消失。若查询包含不确定数据如CURRENT_DATE(),则无法缓存。写入数据会导致相关表的缓存失效。通过调整query_cache_limit和query_cache_size参数可配置缓存大小。通过show status命令可查看缓存使用情况,关注Qcache_hits和Qcache_lowmem_prunes等指标以评估缓存效果。

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

MySQL缓存机制:

当MySQL开启了缓存模式(query_cache_type=1)后,mysql会把查询语句和查询结果保存在一张hash表中,下一次用同样的sql语句查询时,mysql会先从这张hash表中获取数据,如果缓存没有命中,则解析sql语句,查询数据库。 当缓存的数据达到最大值(query_cache_size) 后,mysql会把老的数据删除掉,写入信的数据。

mysql的缓存是非持久化的,当mysql重启后,缓存即消失。

如果查询中有不确定数据,例如CURRENT_DATE()和NOW()函数,那么查询完毕后则不会被缓存.所以,包含不确定数据的查询是肯定不会找到可用缓存的

缓存失效:

当某个表正在写入数据,则这个表的缓存(命中检查,缓存写入等)将会处于失效状态.在Innodb中,如果某个事务修改了表,则这个表的缓存在事务提交前都会处于失效状态,在这个事务提交前,这个表的相关查询都无法被缓存。

如何配置缓存:

用 show variables like '%query_cache%'  命令查看缓存是否开启:


参数解释:

have_query_cache :  表示此版本mysql是否支持缓存

query_cache_limit  :缓存最大值

query_cache_size :  缓存大小

query_cache_type :off 表示不缓存,on表示缓存所有结果

开启缓存方式:在my.ini 文件底部添加:

query_cache_type = 1
如果query_cache_size  值为0 ,也需要在my.ini中设置为需要的值。


查看缓存使用情况:

使用命令 : show status;


参数解释:

Qcache_free_blocks:表示查询缓存中目前还有多少剩余的blocks,如果该值显示较大,则说明查询缓存中的内存碎片过多了,可能在一定的时间进行整理。

Qcache_free_memory:查询缓存的内存大小,通过这个参数可以很清晰的知道当前系统的查询内存是否够用,是多了,还是不够用,DBA可以根据实际情况做出调整。

Qcache_hits:表示有多少次命中缓存。我们主要可以通过该值来验证我们的查询缓存的效果。数字越大,缓存效果越理想。

Qcache_inserts:表示多少次未命中然后插入,意思是新来的SQL请求在缓存中未找到,不得不执行查询处理,执行查询处理后把结果insert到查询缓存中。这样的情况的次数,次数越多,表示查询缓存应用到的比较少,效果也就不理想。当然系统刚启动后,查询缓存是空的,这很正常。

Qcache_lowmem_prunes:该参数记录有多少条查询因为内存不足而被移除出查询缓存。通过这个值,用户可以适当的调整缓存大小。

Qcache_not_cached:表示因为query_cache_type的设置而没有被缓存的查询数量。

Qcache_queries_in_cache:当前缓存中缓存的查询数量。

Qcache_total_blocks:当前缓存的block数量。






参考:

http://www.cnblogs.com/zemliu/archive/2013/08/03/3234372.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT界鸟叔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值