首页/数据/数据库速查/查询缓存已退场(8.0 移除 Query Cache)
性能与调优57 条

查询缓存已退场(8.0 移除 Query Cache)

8.0 正式移除 Query Cache:历史上有全局互斥锁、写热点即失效的顽疾;缓存职责交给应用层/Redis/代理层,数据库侧专注执行。

数据库速查数据更新于 2026-10-13

查询缓存为什么被移除

查询缓存(Query Cache)在 MySQL 5.7 就被标记弃用,8.0 被彻底移除:query_cache_type、query_cache_size 等变量与 SQL_CACHE、SQL_NO_CACHE 子句都不再存在。退场原因是失效颗粒度太粗——任何一张表的写入都会让该表在缓存里的所有结果作废,高并发写入下命中率极低却要付出全局锁竞争成本。缓存职责交回应用层、Redis 或代理层。

基本信息

适用版本MySQL 5.7 可用但已弃用;8.0 完全移除
判定方式8.0 上 SHOW VARIABLES LIKE 'query_cache%' 返回空集
历史缺陷全局互斥锁加表级失效,写热点表几乎无收益
替代方案应用层缓存、Redis、代理层查询缓存、只读副本
升级影响my.cnf 里残留 query_cache_* 参数会导致实例启动失败
MariaDB 差异MariaDB 10.x 仍保留查询缓存

典型使用场景

  • 从 5.7 升级到 8.0 之前做配置兼容盘点
  • 接手老系统时判断数据库层还有没有查询缓存可用
  • 解释历史上「开了查询缓存反而更慢」的现象
  • 设计读多写少接口的缓存方案时界定数据库与缓存的职责边界
  • 排查升级后应用报未知系统变量的报错

升级前后检查

升级前后检查
# 5.7 上确认现状:命中率长期为 0 就是该弃用的信号
mysqladmin -uroot -p variables | grep -i query_cache
mysql -uroot -p -e "SHOW STATUS LIKE 'Qcache%';"

# 8.0 上执行:返回空集说明变量已不存在
mysql -uroot -p -e "SHOW VARIABLES LIKE 'query_cache%';"

# 扫配置文件与脚本里的残留参数或子句
grep -rniE 'query_cache|SQL_CACHE|SQL_NO_CACHE' /etc/my.cnf /etc/my.cnf.d/ /opt/app/sql/

# 8.0 上更该关注的读性能指标
mysql -uroot -p -e "SHOW STATUS LIKE 'Innodb_buffer_pool_read%';"
mysql -uroot -p -e "SHOW STATUS LIKE 'Threads_connected';"

升级清理清单

检查项5.7 里的形态8.0 的处理
query_cache_type0 / 1 / 2删除该行,否则启动失败
query_cache_size常被设成几十 MB删除
query_cache_limit限制单条结果集大小删除
query_cache_min_res_unit内存分配粒度删除
SQL_CACHE / SQL_NO_CACHE写在语句或代码里清掉,8.0 不再识别
监控面板与巡检脚本采集 Qcache_* 指标改采缓冲池命中率等指标
查询缓存的历史教训是失效颗粒度:任何写入都会让整张表的结果作废,所以它对写多读少的库几乎没有价值。做应用层或 Redis 缓存时要同样注意键设计与失效粒度,否则会把同一个问题在应用层重演一遍。

易错点

  • 升级 8.0 时照着 5.7 的 my.cnf 原样搬:残留 query_cache_* 参数导致实例起不来
  • 以为 8.0 还留着隐形查询缓存:重复查询不会自动加速,热点读必须显式做缓存
  • 沿用 5.7 的 Qcache 监控面板:8.0 上指标不存在,监控出现空图掩盖真实问题
  • 把代理层缓存当成全局缓存的等价替代:写后仍可能读到过期结果,需要按规则配置过期时间
  • 只看配置不看代码:SQL 里的 SQL_NO_CACHE 提示不清掉,升级后语句直接报错

数据来源与参考

  • MySQL 8.0 Release Notes: Removal of Query Cache
  • MySQL 8.0 Reference Manual: 已移除特性

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌