mysql 8.0 中查询缓存已被彻底移除,相关变量(如 query_cache_type)在源码中物理删除,配置即报错“unknown system variable”,服务无法启动;必须删除 my.cnf 中所有 query_cache_ 配置项,转向应用层缓存或 innodb 缓冲池优化。

MySQL 8.0 中根本无法关闭查询缓存——它已经不存在了。 你不是“该不该关”,而是“想关也关不了”,任何尝试配置或启用的行为都会直接失败。
my.cnf 里写 query_cache_type 会启动失败
MySQL 8.0 启动时若在配置文件中出现 query_cache_type、query_cache_size 或 query_cache_limit,服务将拒绝启动,并报错:
Unknown system variable 'query_cache_type'
这不是警告,是硬性报错。因为这些变量已在源码中被彻底删除,不是“默认关”,是物理移除。
- 检查当前版本:运行
SELECT VERSION();,确认是否真为8.0.x - 搜索配置文件:用
grep -i query_cache /etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf找出残留配置 - 删掉整行:哪怕只留
query_cache_type = 0,也会让 mysqld 启动不起来
SHOW VARIABLES LIKE 'query_cache%' 返回空或报错
执行该命令后如果没结果,或者提示 Unknown system variable,说明你正在用的是 MySQL 8.0+。这不是配置遗漏,是模块已下线。
- 别再查
Qcache_hits、Qcache_inserts等状态变量——它们同样不存在 - 应用层若还依赖
SQL_CACHE提示(如SELECT SQL_CACHE * FROM t),该语句在 8.0 中会静默忽略提示,但语法仍合法(不报错) - 升级前从 5.7 迁移时,务必清理所有相关配置和 SQL hint,否则上线后可能因启动失败导致服务中断
为什么 5.7 还要手动设 query_cache_type = 0?
如果你还在用 MySQL 5.7,那确实需要主动关闭——不是“建议”,是必须。它的查询缓存机制在高并发写场景下就是全局锁瓶颈源头。
- 一次
UPDATE users SET name='x' WHERE id=123就会持锁清空所有涉及users表的缓存条目 - 所有并发
SELECT必须排队等这个锁,Threads_running会飙升,innodb_row_lock_waits可能同步上升 - 用
SHOW STATUS LIKE 'Qcache%';验证:若Qcache_hits占比长期低于 5%,说明缓存基本没用,但锁开销照常发生
最容易被忽略的点是:很多人以为“我读多写少,缓存应该有用”,却没意识到定时任务、日志写入、埋点上报这些后台操作也在持续触发表级失效。真正影响性能的,从来不是缓存有没有命中,而是那个谁都绕不开的 LOCK_query_cache 全局锁。











