MySQL查询缓存
MySQL在查询的时候首先会查询缓存,如果缓存命中的话就直接返回结果,不需要解析sql语句,也不会生成执行计划,更不会执行;如果没有命中缓存,则再进行SQL解析以及进行查询,并将结果返回(也同时将结果放入到缓存中)
缓存查找是利用对大小写敏感的哈希查找来实现的,Hash查找只能进行全值查找(sql完全一致),如果缓存命中,检查用户权限,如果权限允许,直接返回,查询不被解析,也不会生成查询计划,由于在缓存更新的时候会对数据加锁,所以对于读写比较频繁的系统,建议关闭缓存
缓存何时失效
MySQL的查询缓存系统会跟踪查询中涉及的每个表,如果这些表(数据或结构)发生变化,那么和这张表相关的所有缓存数据都将失效。正因为如此,在任何的写操作时,MySQL必须将对应表的所有缓存都设置为失效。如果查询缓存非常大或者碎片很多,这个操作就可能带来很大的系统消耗,甚至导致系统僵死一会儿
查询缓存不仅仅影响写操作,对于读操作中任何的查询语句在开始之前都必须经过检查,即使这条SQL语句永远不会命中缓存;如果查询结果可以被缓存,那么执行完成后,会将结果存入缓存,也会带来额外的系统消耗
可以将query_cache_type
设置为DEMAND,可以通过SQL_CACHE和SQL_NO_CACHE来控制某个查询语句是否需要进行缓存,这时只有加入SQL_CACHE的查询才会走缓存,其他查询则不会,这样可以非常自由地控制哪些查询需要被缓存
1 | select sql_cache * from user |
- 只有查询sql完全一致时才会走查询缓存
- 表数据更改会删除表的查询缓存
- 包含存储过程、函数、用户变量、触发器的查询语句不会走查询缓存
参数配置
query_cache_type
设置查询缓存是否开启,可以设置为OFF/ON/DEMANDhave_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
设置查询缓存分配的内存块的最小单元(每个结果集)
缓存信息
1 | show status like 'Qcache%'; |