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,并没有真正的关闭;