MySQL 8.0 及以后版本完全删除了 Query Cache 功能,相关系统变量均已废弃;5.7 及更早版本也不推荐启用,因其缓存粒度粗、失效激进、易引发锁竞争,OLTP 场景下反而降低 TPS。
MySQL 查询缓存(Query Cache)在 8.0 中已彻底移除
直接说结论:MySQL 8.0 及以后版本**完全删除了 Query Cache 功能**,query_cache_type、query_cache_size 等所有相关系统变量均已废弃。如果你正在用 8.0+,任何试图开启或调优查询缓存的操作都会失败,配置文件里写上也会被忽略,启动时还会报警告。
即使你用的是 5.7 或更早版本,Query Cache 也**不推荐启用**——它在高并发写入场景下极易成为性能瓶颈,因为只要表有任意一行被修改,该表所有缓存的 SELECT 结果都会被清空,锁竞争严重。
为什么 MySQL 会废弃 Query Cache
核心问题在于它的缓存粒度太粗、失效太激进:
-
SELECT * FROM users WHERE id = 123和SELECT name FROM users WHERE id = 123被视为两个完全不同的查询,无法共享缓存 - 只要
UPDATE users SET status=1 WHERE id=123执行一次,整个users表相关的所有缓存条目全被清掉 - 缓存命中前需对 SQL 字符串做全量比对(大小写敏感、空格敏感),开销不小
- 多线程环境下,
query_cache_mutex锁常导致线程阻塞,QPS 上不去
实测表明:在 OLTP 场景下,开启 Query Cache 后 TPS 反而下降 10%~30%,尤其当写入频率 > 50 QPS 时,几乎毫无收益。
替代方案:用好 InnoDB 缓冲池和客户端缓存
真正有效的缓存不在 SQL 层,而在更合适的位置: