为什么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决定取消查询缓存,以便提高整体性能和可维护性。

目录
相关文章
|
9月前
|
NoSQL Redis 数据库
为什么 Lua 脚本可以保证原子性?
Redis中的原子性包含两层含义:并发编程中的“操作不可中断”与数据库ACID中的“全执行或全回滚”。Lua脚本在Redis中以单线程整体执行,保证了前者,但出错不回滚,故不满足后者。需明确讨论的是哪种原子性。
418 0
|
11月前
|
SQL 存储 缓存
【Java架构师体系课 | MySQL篇】① 全面理解MySQL架构设计
本文详解MySQL一条SQL查询与更新语句的执行流程,涵盖连接器、分析器、优化器、执行器及存储引擎层协作机制,并深入解析redo log与binlog日志如何通过两阶段提交保障数据一致性与恢复能力。
366 2
|
11月前
|
SQL 存储 关系型数据库
MySQL中到底什么是覆盖索引、索引下推?
覆盖索引指查询只需通过索引即可获取数据,无需回表,提升查询效率。索引下推则在索引遍历时提前过滤条件,减少回表次数,尤其适用于联合索引中部分字段无法使用的情况,二者均能显著降低I/O开销,提高查询性能。(238字)
905 1
|
11月前
|
架构师 IDE Java
【Java架构师】Maven中lombok那点事
SpringBoot项目中Lombok需在maven-compiler-plugin中配置`annotationProcessorPaths`,确保编译期生成getter/setter等方法;而`excludes`则在打包时排除Lombok依赖,减小体积,因运行时已无需该库。
917 1
|
10月前
|
SQL 存储 关系型数据库
MySQL误删/批量更新数据恢复实战:基于Flashback工具的完整方案
本文介绍MySQL闪回技术,对比主流工具binlog2sql、MyFlash和my2sql,详解基于my2sql的误操作恢复流程,涵盖原理、实操步骤与预防措施,助力高效恢复批量数据误删/误改问题。
965 0
MySQL误删/批量更新数据恢复实战:基于Flashback工具的完整方案
|
11月前
|
Linux Shell
Linux系统安装miniconda详细教程
本文介绍在CentOS 7系统中安装Miniconda的完整步骤:首先下载Miniconda安装包至/opt目录,接着执行安装脚本并按提示操作;安装完成后,将conda添加到环境变量,通过`conda init bash`和`source ~/.bashrc`配置生效,最终验证安装成功。
2929 5
|
9月前
|
负载均衡 Dubbo Java
Dubbo 和 Feign的区别是什么?
Dubbo是高性能RPC框架,支持多种协议与服务治理,适用于Java微服务架构;Feign是声明式HTTP客户端,简化Spring Cloud服务调用。两者定位不同,Dubbo强在性能与治理,Feign重在易用与集成。
930 0
|
11月前
|
SQL 算法 关系型数据库
【Java架构师体系课 | MySQL篇】⑥ 索引优化实战二
本文介绍了MySQL查询与数据类型优化策略,涵盖分页查询、Join关联、in/exist选择、count(*)优化及数据类型选取。通过索引优化、改写SQL、合理使用算法与数据类型,可显著提升数据库性能。
353 7
|
11月前
|
SQL 缓存 Java
【Java架构必看】Mybatis的工作原理
MyBatis执行分启动与运行两阶段:启动时加载配置,运行时代理执行SQL。通过JDK动态代理生成Mapper接口,结合缓存机制与Executor执行SQL,最终由TypeHandler完成结果映射。
618 4

热门文章

最新文章