JeffSunpan27

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

mysql query cache#

今天发现一个坑,数据库负载突然升高,并出现大量的waiting for query cache lock,进程锁死。线上配置为query_cache_size =50M,query_cache_type 的值为 2。通过查找官方文档发现type=2的意思是:只缓存以SELECT SQL_NO_CACHE开头的查询结果。先临时关闭,等到晚上再重启数据库永久生效。

临时关闭: set global query_cache_type=OFF,set global query_cache_size=0

永久关闭:query_cache_size = 0,query_cache_type = 0

query cache机制#

当数据库打开了Query Cache功能后,数据库在执行SELECT语句时,会将其结果放到QC中,当下一次处理同样的SELECT请求时,数据库就会从QC取得结果,而不需要去数据表中查询。

但是!如果数据表被更改,那么和这个数据表相关的全部Cache全部都会无效,并删除之。这里“数据表更改”包括: INSERT, UPDATE, DELETE, TRUNCATE, ALTER TABLE, DROP TABLE, or DROP DATABASE等。

如果你的数据表更新频繁的话,那么Query Cache将会成为系统的负担。在5.6.8版本后query_cache_type默认为关闭状态。为了保险起见,我们设置双0。

配置注意事项#

1、想要彻底关闭query cache,务必在一开始就设置 query_cache_type = 0,即便是启动后将 query_cache_type 从 1 改成 0,也不行;

2、即便query_cache_size = 0,但 query_cache_type 非 0 的话,在实际环境中,可能会频繁发生 Waiting for query cache lock;

3、一开始就设置 query_cache_type = 0 的话,没有办法在运行 过程中再次动态启用,反过来则可以。也就是说,一开始是启用 query cache 的, 在运行过程中将其关闭,但事实上仍然会发生 Waiting for query cache lock,并没有真正的关闭;

posted on 2017-12-28 17:56  JeffSunpan27  阅读(698)  评论(0编辑  收藏  举报