mysql 8.0起彻底移除query cache,所有相关变量和模块已被物理删除,配置即报错;仅5.7及更早版本支持,需通过my.cnf配置query_cache_type与query_cache_size并重启生效。

确认 MySQL 版本是否支持 query_cache
MySQL 8.0 起已彻底移除 query_cache 相关所有功能,任何配置都会被忽略。所以第一步必须确认版本:
- 执行
mysql --version或登录后运行SELECT VERSION(); - 若返回类似
8.0.33、8.4.0或更高,直接跳过后续配置——query_cache_type、query_cache_size等参数已不存在,设了也无效 - 只有
5.7、5.6或更早版本才真正支持查询缓存
在 my.cnf 中配置 query_cache_type 和 size
仅适用于 MySQL 5.7 及之前版本。编辑 /etc/my.cnf(或 /etc/mysql/my.cnf),在 [mysqld] 段落下添加:
query_cache_type = 1 query_cache_size = 64M query_cache_limit = 2M query_cache_min_res_unit = 4096
注意:
-
query_cache_type = 1表示自动缓存所有符合条件的SELECT;设为2则只缓存显式带SQL_CACHE的语句 -
query_cache_size必须大于 0 才会启用缓存,设为0等同于关闭 - 不要盲目设大,超过 256M 容易引发锁争用和内存碎片,反而拖慢性能
- 修改后必须执行
sudo systemctl restart mysql(或mysqld)才能生效
运行时动态设置 query_cache 失败怎么办
执行 SET GLOBAL query_cache_size = 67108864; 报错 Query cache is disabled 是常见现象,原因很明确:
- MySQL 启动时
query_cache_size = 0,即使你后来SET GLOBAL,也无法激活缓存机制 - 必须先在配置文件中设好
query_cache_size > 0且query_cache_type非 0,再重启服务 -
SET GLOBAL只能调整已启用状态下的值,不能“唤醒”被启动参数禁用的功能
验证 query_cache 是否真正在工作
重启后登录 MySQL,运行:
SHOW VARIABLES LIKE 'query_cache%'; SHOW STATUS LIKE 'Qcache%';
关键看:
-
query_cache_size是否非零 → 确认配置加载成功 -
Qcache_hits是否随重复查询递增 → 命中才说明缓存起效 -
Qcache_lowmem_prunes持续增长 → 内存不够,需调大query_cache_size或减小query_cache_limit - 注意:大小写敏感、空格差异、注释不同、
USE INDEX提示变化,都会导致缓存不命中
真正容易被忽略的是:哪怕配置全对,只要表有任意 INSERT/UPDATE/DELETE,对应的所有缓存条目就立即失效——这不是延迟过期,是即时清除。所以高写入场景下,缓存命中率天然极低,此时开启反而增加管理开销。











