MySQL 8.0中查询缓存(Query Cache)的废弃与原因分析
引言
尽管MySQL的查询缓存(Query Cache)最初设计目的是为了提升性能,但因其存在严重的可扩展性问题和易成为系统瓶颈,MySQL在8.0版本中正式移除了这一功能。自5.7版本起,MySQL已将查询缓存的默认启用状态调整为关闭,并最终在5.7.20版将其标记为过时。本文将深入探讨为何MySQL在历经多个版本迭代后,决定取消查询缓存,以及查询缓存的设计初衷。
什么是MySQL Query Cache
查询缓存(Query Cache)是MySQL中的一项特殊缓存机制,用于存储SELECT语句及其对应结果集,当遇到相同的查询请求时,直接从缓存中返回结果,避免重复执行查询。此功能在数据变动频率低且重复查询多的场景下尤为有效。
MySQL缓存发挥作用的条件
- 降低查询执行时间,但不减少网络传输消耗。
- 资源密集型查询适合缓存,前提是更新操作相对较少。
- 查询缓存命中率需视具体情况而定,即使较低的命中率也可能带来性能提升。
- 缓存未命中可能由多种因素引起,包括缓存未完成预热、查询首次执行、缓存因内存不足或数据修改而失效等。
Query Cache对性能的影响
额外开销
- 开启查询缓存会增加读写操作的额外消耗,包括查询前的缓存检查、查询结果的缓存写入、数据修改后的缓存清除及事务提交前的缓存延迟使用。
碎片优化
- 通过调整
query_cache_min_res_unit
参数可减少内存碎片,合理设置可平衡内存浪费和CPU消耗。 - 使用
FLUSH QUERY CACHE
命令可整理碎片,集中空闲空间。
状态监控
- 监控
Qcache_free_blocks
、Qcache_free_memory
、Qcache_hits
等状态变量,评估缓存的健康状况。
Query Cache的优势与劣势
优势
- 在只读或读多写少的场景下,开启查询缓存能显著提升查询效率。
劣势
- 字节级别匹配严格,轻微变化即导致缓存无法命中。
- 缓存过期机制过于保守,对数据修改敏感。
- 分区表下自动禁用。
- 增加不必要的额外负载。
MySQL官方的抉择
- MySQL团队认为减少性能波动比提升峰值吞吐量更为关键,因此决定移除查询缓存,转而投资于更广泛适用的优化方案。
- 建议使用第三方工具如ProxySQL作为替代,其性能表现优于原生查询缓存。
综上所述,MySQL 8.0中移除查询缓存的决策 ,旨在提供更加稳定、可预测的性能表现