mysql 8.0+ 已彻底移除查询缓存,相关参数和语法均被废弃;替代方案是优化 innodb 缓冲池、索引及应用层缓存。

MySQL 8.0 默认已彻底移除查询缓存(query_cache_type、query_cache_size 等参数全部废弃),所以「配置查询缓存」在新版本中根本不可行——不是配不对,而是没得配。
为什么 MySQL 8.0+ 不能启用查询缓存
查询缓存在 MySQL 5.7 及更早版本中就因严重缺陷被弃用:它基于 SQL 文本全匹配,任何空格、注释、大小写差异都会导致缓存失效;且全局锁机制使高并发下成为性能瓶颈。MySQL 官方在 8.0 中直接删除了所有相关代码。
-
SHOW VARIABLES LIKE 'query_cache%'在 8.0+ 返回空结果 - 若配置文件中仍保留
query_cache_type=1,启动时会报警告:[Warning] 'query_cache_type' is deprecated and will be removed in a future release. - 试图执行
SELECT SQL_CACHE ...会直接报错:ERROR 1286 (42000): Unknown table engine 'QUERY CACHE'
替代方案:用 InnoDB 缓冲池 + 查询重写优化响应速度
真正影响「重复查询性能」的,是 InnoDB 的缓冲池(innodb_buffer_pool_size)和索引效率,而非已被淘汰的查询缓存。
- 确保
innodb_buffer_pool_size设置为物理内存的 50%–75%(例如 16GB 内存设为12G),让热数据常驻内存 - 对高频查询加覆盖索引,避免回表,
EXPLAIN检查type是否为ref/range,Extra不含Using filesort或Using temporary - 用
SELECT ... INTO OUTFILE或应用层缓存(如 Redis)处理真正不变或低频变更的结果集,比原生查询缓存更可控
如果必须用旧版 MySQL(5.7 或更早)启用查询缓存
仅适用于遗留系统迁移前的临时维持,且需严格满足条件:
- MySQL 版本 ≤ 5.7.20,且未升级到 5.7.21+(该版本起默认禁用)
- 配置文件
my.cnf中明确设置:[mysqld] query_cache_type = 1 query_cache_size = 268435456 query_cache_limit = 2097152
- 重启后执行
SHOW VARIABLES LIKE 'query_cache%'确认值非零,再用SHOW STATUS LIKE 'Qcache%'观察命中率(Qcache_hits / (Qcache_hits + Qcache_inserts)> 0.7 才算有效) - 注意:一旦开启,所有
SELECT默认尝试缓存,但SELECT SQL_NO_CACHE可跳过;而任何对该表的INSERT/UPDATE/DELETE都会使该表所有缓存条目失效
现在主流部署基本都跑在 MySQL 8.0+,纠结「怎么打开查询缓存」不如花十分钟检查 innodb_buffer_pool_size 是否合理、慢查询日志里有没有漏掉的未加索引字段——那些才是真正拖慢重复查询的地方。










