mysql 8.0已彻底移除查询缓存,query_cache_type等配置报错即表明其源码级删除;无缓存兜底后,索引失效直接导致全表扫描,响应时间陡增,必须依赖精准索引设计与innodb buffer pool优化。

MySQL 8.0 取消查询缓存后,索引设计不再有“结果缓存兜底”,每条 SELECT 都必须真实走索引或全表扫描——没索引,就真慢。
query_cache_type 配置直接报错,说明缓存已不存在
你在 my.cnf 里写 query_cache_type = 0 或 query_cache_size = 16M,MySQL 8.0 启动时会报 Unknown variable 'query_cache_type' 并退出。这不是配置错误,是源码级删除:所有 query_cache_* 变量、哈希表逻辑、全局锁 LOCK_query_cache 全部移除。别再查旧文档配它,也别指望“关掉还能留个壳”。
没有缓存兜底,索引失效=响应时间直线上升
以前哪怕 SQL 没走索引、全表扫描了,只要语句文本完全一致(空格/大小写都一样),且表没被更新过,查询缓存还能返回结果——掩盖了索引问题。现在没了这层缓冲:
- EXPLAIN 显示
type = ALL就等于实打实扫全表,QPS 上去立刻暴露 I/O 瓶颈 - WHERE 条件里用了函数(如
WHERE DATE(created_at) = '2026-07-01'),索引失效,就真没缓存可救 - 联合索引顺序写反(比如建了
(status, user_id)却查WHERE user_id = 123),优化器直接跳过索引,不走就是不走 - SELECT * + 大字段 + 没覆盖索引 → 回表次数爆炸,Buffer Pool 压力陡增,而 Buffer Pool 不缓存结果,只缓页
真正起作用的缓存只剩 InnoDB Buffer Pool,它和索引强绑定
MySQL 8.0 唯一靠谱的内置缓存是 innodb_buffer_pool_size,但它缓的是数据页和索引页,不是 SQL 结果。这意味着:
- 高频查询的索引节点必须常驻 Buffer Pool,否则每次都要从磁盘加载 B+ 树节点
- 覆盖索引越精准,Buffer Pool 中只需缓二级索引页,不用加载聚簇索引页,内存利用率更高
-
SHOW ENGINE INNODB STATUS里的Buffer pool hit rate掉到 95% 以下,大概率是索引没建对,导致随机 I/O 暴增 - 索引字段顺序、是否包含排序字段(ORDER BY)、是否支持范围查询(> / BETWEEN),直接影响 Buffer Pool 中页的局部性与复用率
容易被忽略的一点是:缓存没了,但索引维护成本没变——冗余索引照样拖慢 INSERT/UPDATE,而你再也无法靠“缓存能扛一阵”来拖延索引治理。该删的索引、该合并的联合索引、该加的覆盖字段,现在必须当场解决。











