MySQL查询缓存

MySQL查询缓存

MySQL在查询的时候首先会查询缓存,如果缓存命中的话就直接返回结果,不需要解析sql语句,也不会生成执行计划,更不会执行;如果没有命中缓存,则再进行SQL解析以及进行查询,并将结果返回(也同时将结果放入到缓存中)

MySQL查询过程

缓存查找是利用对大小写敏感的哈希查找来实现的,Hash查找只能进行全值查找(sql完全一致),如果缓存命中,检查用户权限,如果权限允许,直接返回,查询不被解析,也不会生成查询计划,由于在缓存更新的时候会对数据加锁,所以对于读写比较频繁的系统,建议关闭缓存

缓存何时失效

MySQL的查询缓存系统会跟踪查询中涉及的每个表,如果这些表(数据或结构)发生变化,那么和这张表相关的所有缓存数据都将失效。正因为如此,在任何的写操作时,MySQL必须将对应表的所有缓存都设置为失效。如果查询缓存非常大或者碎片很多,这个操作就可能带来很大的系统消耗,甚至导致系统僵死一会儿

查询缓存不仅仅影响写操作,对于读操作中任何的查询语句在开始之前都必须经过检查,即使这条SQL语句永远不会命中缓存;如果查询结果可以被缓存,那么执行完成后,会将结果存入缓存,也会带来额外的系统消耗

可以将query_cache_type设置为DEMAND,可以通过SQL_CACHE和SQL_NO_CACHE来控制某个查询语句是否需要进行缓存,这时只有加入SQL_CACHE的查询才会走缓存,其他查询则不会,这样可以非常自由地控制哪些查询需要被缓存

select sql_cache * from user
  • 只有查询sql完全一致时才会走查询缓存
  • 表数据更改会删除表的查询缓存
  • 包含存储过程、函数、用户变量、触发器的查询语句不会走查询缓存

参数配置

query_cache_type 设置查询缓存是否开启,可以设置为OFF/ON/DEMAND
have_query_cache 查看是否支持查询缓存
query_cache_size 设置查询缓存的内存大小
query_cache_limit 设置单条查询缓存可用的存储最大值(加上sql_no_cache可以提高效率)
query_cache_wlock_invalidate 设置当写锁在某个表上时,读请求是要等待写锁释放资源之后在查询还是允许直接从query cache中读取结果(false表示可以直接从query cache中取得结果)针对MyISAM存储引擎
query_cache_min_res_unit 设置查询缓存分配的内存块的最小单元(每个结果集)

缓存信息

show  status  like  'Qcache%';

Qcache_free_blocks	1    查询缓存中的可用内存块数,该值如果较大,说明query cache中的内存岁票较多,需要清理
Qcache_free_memory	16760152 查询缓存的可用内存量
Qcache_hits	0  查询缓存命中数
Qcache_inserts	0  添加到查询缓存的查询数
Qcache_lowmem_prunes	0  由于内存不足而从查询缓存中删除的条数
Qcache_not_cached	102277604   非缓存查询的数量
Qcache_queries_in_cache	0  当前查询缓存中的查询数
Qcache_total_blocks	1 查询缓存总块数

https://zhhll.icu/2021/数据库/关系型数据库/MySQL/进阶/20.MySQL查询缓存/

本文由mdnice多平台发布

  • 10
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

拾光师

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

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

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

打赏作者

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

抵扣说明:

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

余额充值