为什么MySQL8.0 要取消查询缓存?

简介: MySQL查询缓存曾用于提升SELECT性能,通过缓存结果避免重复执行,但因频繁失效、内存开销大、一致性问题及不均查询分布等缺陷,自8.0版本起被彻底移除,以优化整体性能与维护性。

mysql1.jpg

MySQL的查询缓存是一种数据库性能优化技术,它允许MySQL在执行SELECT时将查询结果缓存起来,以便在以后相同的查询被再次执行时,可以直接返回缓存的结果,而不必再次重新解析和执行该语句。


查询缓存在session之间共享,因此由一个客户端生成的结果集可以用来响应另一个客户端发出的相同查询。


查询缓存可以提高查询性能,尤其是具有不经常更改的表且服务器接收到许多相同查询的环境中非常有用。


但是查询缓存是存在一定的限制的,如:

  1. 查询缓存是根据查询文本来匹配查询的。查询必须以字节级别完全匹配,包括大小写敏感性。如果查询文本不完全相同,查询将不会被缓存。
  2. 包含非确定性函数的查询结果不会缓存,例如RAND()和NOW()。这是因为这些函数的结果在不同的执行之间可能会不同,因此无法缓存结果。
  3. 如果查询涉及使用临时表,查询缓存将不会工作。这是因为临时表的存在会导致查询无法被缓存。
  4. 查询缓存被设计成不提供陈旧的结果。对底层表的任何修改都会导致这些表的所有缓存失效。
  5. 某些存储引擎可能不支持查询缓存,或者在特定情况下限制了其使用。例如,InnoDB存储引擎在某些情况下不使用查询缓存,以便支持多版本并发控制(MVCC)。

在MySQL 5.6之前,查询缓存默认开启的,但是从5.6开始,查询缓存已经默认禁用了!

但是,在MySQL 8.0中取消了查询缓存:https://dev.mysql.com/blog-archive/mysql-8-0-retiring-support-for-the-query-cache/


主要原因是因为虽然他能带来一定的性能提升,但它也有一些明显的缺点,这些缺点导致了MySQL 8.0取消查询缓存的决定:

频繁失效:查询缓存是以表级别为单位进行管理的,这意味着如果任何表中的数据发生变化,与该表相关的所有查询缓存都将被清除。这导致了缓存的频繁失效,减少了其效用。
  1. 内存开销:查询缓存需要占用大量内存来存储查询文本和结果集,这对于具有大量查询和数据的数据库来说,会导致内存开销问题。
  2. 不一致性:有时查询结果可能会因为数据库中的数据更改而不再与缓存的结果匹配,这可能导致不一致性的问题。
  3. 查询分布不均匀:在某些情况下,查询缓存可能会导致性能下降,因为它不能很好地应对不均匀的查询分布。(部分频繁查询需要频繁更新缓存,不频繁的查询又无法命中缓存)

所以,MySQL 8.0决定取消查询缓存,以便提高整体性能和可维护性。

目录
相关文章
|
29天前
|
SQL 存储 关系型数据库
MySQL中到底什么是覆盖索引、索引下推?
覆盖索引指查询只需通过索引即可获取数据,无需回表,提升查询效率。索引下推则在索引遍历时提前过滤条件,减少回表次数,尤其适用于联合索引中部分字段无法使用的情况,二者均能显著降低I/O开销,提高查询性能。(238字)
188 1
|
1月前
|
SQL 存储 缓存
【Java架构师体系课 | MySQL篇】① 全面理解MySQL架构设计
本文详解MySQL一条SQL查询与更新语句的执行流程,涵盖连接器、分析器、优化器、执行器及存储引擎层协作机制,并深入解析redo log与binlog日志如何通过两阶段提交保障数据一致性与恢复能力。
167 2
|
存储 安全 数据安全/隐私保护
医学影像PACS系统:一种用于存储、管理和传输医学影像数据的系统
医学影像PACS系统:一种用于存储、管理和传输医学影像数据的系统
1951 0
医学影像PACS系统:一种用于存储、管理和传输医学影像数据的系统
|
29天前
|
Linux Shell
Linux系统安装miniconda详细教程
本文介绍在CentOS 7系统中安装Miniconda的完整步骤:首先下载Miniconda安装包至/opt目录,接着执行安装脚本并按提示操作;安装完成后,将conda添加到环境变量,通过`conda init bash`和`source ~/.bashrc`配置生效,最终验证安装成功。
321 5
|
29天前
|
架构师 IDE Java
【Java架构师】Maven中lombok那点事
SpringBoot项目中Lombok需在maven-compiler-plugin中配置`annotationProcessorPaths`,确保编译期生成getter/setter等方法;而`excludes`则在打包时排除Lombok依赖,减小体积,因运行时已无需该库。
127 0
|
弹性计算 tengine 负载均衡
云原生 - 负载均衡(SLB)配置 HTTPS 访问设置
云原生 - 负载均衡(SLB)配置 HTTPS 访问设置
2541 0
云原生 - 负载均衡(SLB)配置 HTTPS 访问设置
|
1月前
|
SQL 架构师 关系型数据库
【Java架构师体系课 | MySQL篇】⑤ 索引优化实战一
本文深入解析MySQL索引优化原理,涵盖联合索引使用、覆盖索引、索引下推、filesort排序机制及trace工具分析执行计划选择等内容,并结合实际案例提供索引设计原则与SQL优化策略。
106 5
|
1月前
|
SQL 算法 关系型数据库
【Java架构师体系课 | MySQL篇】⑥ 索引优化实战二
本文介绍了MySQL查询与数据类型优化策略,涵盖分页查询、Join关联、in/exist选择、count(*)优化及数据类型选取。通过索引优化、改写SQL、合理使用算法与数据类型,可显著提升数据库性能。
147 7
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
AI智能审计系统,企业风控的“超级大脑”
AI智能审计系统正重塑传统审计:通过NLP读懂合同邮件,用机器学习预警风险,实现7×24小时自动化审查。它让审计从“事后找茬”变为“事前防控”,助力企业风险管理迈向智能化。技术人的新战场,来了!(238字)
|
Prometheus Kubernetes 安全
5 款漏洞扫描工具:实用、强力、全面(含开源)(一)
5 款漏洞扫描工具:实用、强力、全面(含开源)
4363 1
5 款漏洞扫描工具:实用、强力、全面(含开源)(一)