MySQL 清空查询缓存

背景:在 sql 调优的过程中,发现原本很慢的一条 sql(将近 1 分钟) 在第二次运行时, 瞬间就完成了(0.04sec)。这是因为 mysql 自带的缓存机制,将查询结果进行缓存,如果 table 数据未发生变化,再次使用同一条 sql 进行查询时,直接从上次的查询结果缓存中读取数据,而不是重新分析、执行 sql。如果 table 数据发生变化,所有与之相关的缓存都会被释放刷新,这样就不会出现数据脏读问题。

是否使用查询缓存

为了避免缓存,可以在 sql 查询语句的字段前增加 SQL_NO_CACHE 关键字
如:

select from t_user; select SQL_NO_CACHE from t_user;

反之,你也可以使用 SQL_CACHE 关键字,强制 mysql 从缓存中读取数据

select SQL_CACHE * from t_user;

mysql 还提供了一种释放全部缓存的方法

reset query cache;

设置查询缓存

查看是否有查询缓存。

SHOW VARIABLES LIKE ‘have_query_cache’;

注意:只要数据库拥有查询缓存功能,这个 VALUE 就是 YES,无论查询缓存是否启用。

则查询缓存为启用状态。mysql 默认为启用状态
mysql 查询缓存可以通过两个变量来控制,query_cache_type query_cache_size

query_cache_type

SHOW VARIABLES LIKE ‘query_cache_type’;
query_cache_type 包含三种状态

  • 0 or OFF 此时不会从缓存中读取查询数据
  • 1 or ON 表示除非声明了 SELECT SQL_NO_CACHE,否则都会从缓存中读取数据
  • 2 or DEMAND 表示所有语句都会从缓存中读取,相当于所有查询语句都使用了 SELECT SQL_CACHE

通过如下命令可以设置查询缓存状态(需要管理员权限),执行后,需要重启 mysql 服务才能生效。

SET GLOBAL query_cache_type = 1;

但是此命令会影响所有的使用此 mysql 服务的 client。可以通过如下命令,关闭此客户端的查询缓存状态,但是同样需要重启 server 后才能生效。

SET SESSION query_cache_type = OFF; SHOW VARIABLES LIKE ‘query_cache_type’;

query_cache_size

SHOW VARIABLES LIKE ‘query_cache_size’;

query_cache_size 表示缓存大小,默认为 1M。如果设置为 0,则相当于 query_cache_size=OFF
同样可通过 SET GLOBAL 进行设置

SET GLOBAL query_cache_size=40000;

需要注意的是,设置的 query_cache_size,并不全是用于存储数据,还有约 40KB 的空间来维护查询缓存的结构。