清空 MySQL 查询缓存

本贴最后更新于 3266 天前,其中的信息可能已经沧海桑田

mysql 查询缓存

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

The query cache stores the text of a SELECT statement together with the corresponding result that was sent to the client. If an identical statement is received later, the server retrieves the results from the query cache rather than parsing and executing the statement again. The query cache is shared among sessions, so a result set generated by one client can be sent in response to the same query issued by another client.


是否使用查询缓存

为了避免缓存,可以在 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_typequery_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 的空间来维护查询缓存的结构。


Best regards
Wang Yuheng

打赏 20 积分后可见
20 积分 • 4 打赏
  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    691 引用 • 535 回帖
  • cache
    6 引用 • 5 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 88250

    清晰易懂,实用!

  • memoryaxis

    内容不错 刚好我也在看这方面东西 😊

    格式有点乱 码的有点密 加粗斜体有滥用嫌疑 😕

  • 88250

    既然 @memoryaxis 这么处女座,我也来一下:

    请上传一下头像!!!!

  • crick77
    作者

    @memoryaxis 刚开始写 还没注意格式 用粗体斜体说明本意是好的 想醒目一些。。。

  • zonghua

    Ubuntu 14.4 的 mysql 是不是有八阿哥,经常会吃掉内存。现在用 fedora,512MB 都很多啦