mysql 8.0 彻底移除查询缓存,释放innodb因全局锁抑制的mvcc并发能力,并将缓存职责移交buffer pool与应用层,提升吞吐、降低锁争用、优化资源利用。

MySQL 8.0 不是“关掉”查询缓存,而是从源码里彻底删掉了 query_cache_type、query_cache_size 等所有相关逻辑——你写进 my.cnf 就会启动失败,报错 Unknown variable 'query_cache_type'。这对 InnoDB 的影响不是“少了某个功能”,而是释放了原本被 Query Cache 全局锁长期压制的并发能力。
Query Cache 的全局锁直接压制 InnoDB 的 MVCC 并发性
Query Cache 的 LOCK_query_cache 是一个不可降级、无法分片的全局互斥锁。InnoDB 虽然靠 MVCC 支持高并发读,但只要任何线程想查缓存(哪怕只是检查 SELECT * FROM t WHERE id = 1 在不在缓存里),就必须排队等这把锁。结果就是:
- InnoDB 的多版本读被卡在锁外,大量线程阻塞在
Waiting for query cache lock - UPDATE 语句执行时,不仅要加行锁/间隙锁,还要抢
LOCK_query_cache去清空整张表缓存,进一步拉长事务持有锁时间 - Percona 实测:200+ QPS 写入下,开启 Query Cache 时 InnoDB 的
innodb_row_lock_time_avg上升 22%,而吞吐反而下降 15%~30%
InnoDB Buffer Pool 成为唯一核心缓存层
Query Cache 删除后,内存和 CPU 资源不再浪费在哈希计算、字节级 SQL 匹配、碎片整理上,全部让渡给 innodb_buffer_pool_size。这意味着:
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
- 缓存单位从“整条 SELECT 结果集”变成“16KB 数据页”,天然适配 InnoDB 的物理存储结构
- 页缓存支持并发读、LRU 链表淘汰、预读机制,且无全局锁——多个线程可同时读不同页
- 同一行数据被多次查询时,命中的是 Buffer Pool 中的页,而不是反复重建 Query Cache 条目
-
innodb_buffer_pool_pages_data和innodb_buffer_pool_read_requests成为更真实、更可控的性能观测指标
应用层缓存替代方案与 InnoDB 配合更自然
没有 Query Cache 后,业务必须显式设计缓存策略,反而更贴合 InnoDB 的事务语义:
- Redis 缓存 key 可按业务主键(如
user:123)设计,失效粒度精准,不因无关 UPDATE 被误清 - 缓存更新可配合 InnoDB 事务:先写 DB,再删 Redis key,避免脏数据
- ORM(如 MyBatis、Django ORM)生成的预处理语句本来就不走 Query Cache,现在直接绕过历史包袱,直连 Buffer Pool
- 含
NOW()、RAND()、用户变量的查询,以前被 Query Cache 拒之门外,现在能正常利用 Buffer Pool + 索引加速
真正容易被忽略的是:Query Cache 的移除不是“去掉缓存”,而是把缓存控制权从数据库内核移交到更贴近业务的地方。InnoDB 不再被迫为一个低效、粗粒度、强一致却高成本的缓存模块背锅——它的锁调度、页管理、MVCC 路径从此更干净、更可预期。










