MySQL查询缓存
MySQL在查询的时候首先会查询缓存,如果缓存命中的话就直接返回结果,不需要解析sql语句,也不会生成执行计划,更不会执行;如果没有命中缓存,则再进行SQL解析以及进行查询,并将结果返回(也同时将结果放入到缓存中)
缓存查找是利用对大小写敏感的哈希查找来实现的,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 多平台发布