mysql查询缓存

工作原理

缓存SELECT操作的结果集和SQL语句,key为sql,value为查询结果集;

如果新的SELECT语句到了,以这个sql为key去缓存中查询,如果匹配,就把缓存的结果集返回;

匹配标准:与缓存的SQL语句是否完全一样,sql中字母区分大小写以及中间的空格,简单理解为存储了一个key-value结构,key为sql,value为sql查询结果,匹配时使用Java的String的equals(),例如:

select age from user 与 select AGE from user不会匹配,因为大小写不同;
select age from use 与 select  age from user不会匹配,因为空格不同;

sql两边的空格可忽略,可以认为是对key进行过trim操作之后再进行equals比较。

查看mysql设置参数

执行

show variables like ‘query_cache’;

可以看到相关参数:

query_cache_type:0-不启用查询缓存;1-启用,2-启用,默认值为0; 
query_cache_size:设置缓存区总大小,允许设置query_cache_size的值最小为40K,默认1M,推荐设置为:64M/128M;
query_cache_limit:限制缓存区最大能缓存的单条查询记录集大小,默认设置为1M

query_cache_type为1时,只要符合查询缓存的要求,客户端的查询语句和记录集都可以缓存起来,如果SQL中加上 SQL_NO_CACHE将不缓存;

query_cache_type为2时,只要SQL中添加了参数:SQL_CACHE,且符合查询缓存的要求,客户端的查询语句和记录集,则可以缓存起来。

查看缓存使用情况

show status like 'Qcache%' 

可以看到相关参数:

Qcache_hits:缓存命中次数;
Qcache_inserts:缓存中插入次数,每缓存一次加1,注意这个不是缓存数量;

不会缓存的情况

当查询语句中有一些不确定的数据时,则不会被缓存。如包含函数NOW(),CURRENT_DATE()等类似的函数,或者用户自定义的函数,存储函数,用户变量等都不会被缓存

当查询的结果大于query_cache_limit设置的值时,结果不会被缓存

对于InnoDB引擎来说,当一个语句在事务中修改了某个表,那么在这个事务提交之前,所有与这个表相关的查询都无法被缓存。因此长时间执行事务,会大大降低缓存命中率

查询的表是系统表,如select * from mysql

查询语句不涉及表,例如select 1

mysql默认关闭查询缓存

mysql默认是关闭查询缓存的,也就是query_cache_type默认为0。基于以下几点考虑:

开启缓存之后,在查询之前必须先检查是否命中缓存,浪费计算资源

如果这个查询可以被缓存,那么执行完成后,MySQL发现查询缓存中没有这

个查询,则会将结果存入查询缓存,这会带来额外的系统消耗

针对表进行写入或更新数据时,会将对应表的所有缓存都设置失效,可能刚缓存就失效了。

如果查询缓存很大或者碎片很多时,这个操作可能带来很大的系统消耗。

作用可以被redis等存储中间件更好的替代

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章