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

目录
相关文章
|
26天前
|
SQL 存储 关系型数据库
MySQL中到底什么是覆盖索引、索引下推?
覆盖索引指查询只需通过索引即可获取数据,无需回表,提升查询效率。索引下推则在索引遍历时提前过滤条件,减少回表次数,尤其适用于联合索引中部分字段无法使用的情况,二者均能显著降低I/O开销,提高查询性能。(238字)
179 1
|
1月前
|
SQL 存储 缓存
【Java架构师体系课 | MySQL篇】① 全面理解MySQL架构设计
本文详解MySQL一条SQL查询与更新语句的执行流程,涵盖连接器、分析器、优化器、执行器及存储引擎层协作机制,并深入解析redo log与binlog日志如何通过两阶段提交保障数据一致性与恢复能力。
166 2
|
26天前
|
设计模式 数据管理 领域建模
【attice-model 】 源码分析
lattice-model 是 Lattice 框架的核心模块,定义了 Ability、Business 等关键领域模型与元数据结构。通过注解驱动、编译期处理与 SPI 扩展机制,实现配置与代码统一、运行时支撑及插件化隔离,为上层提供高扩展、易维护的架构基础。(238 字)
211 69
|
26天前
|
Linux Shell
Linux系统安装miniconda详细教程
本文介绍在CentOS 7系统中安装Miniconda的完整步骤:首先下载Miniconda安装包至/opt目录,接着执行安装脚本并按提示操作;安装完成后,将conda添加到环境变量,通过`conda init bash`和`source ~/.bashrc`配置生效,最终验证安装成功。
304 5
|
26天前
|
消息中间件 安全 Java
java消费消息且保证消息不丢失
本文介绍Java中如何安全消费消息并防止消息丢失或篡改,涵盖Kafka与RabbitMQ的消息持久化、手动确认机制及偏移量控制,强调事务处理与元数据保留,确保消息完整性与可靠性。
92 0
|
26天前
|
架构师 IDE Java
【Java架构师】Maven中lombok那点事
SpringBoot项目中Lombok需在maven-compiler-plugin中配置`annotationProcessorPaths`,确保编译期生成getter/setter等方法;而`excludes`则在打包时排除Lombok依赖,减小体积,因运行时已无需该库。
117 0
|
27天前
|
SQL 架构师 关系型数据库
【Java架构师体系课 | MySQL篇】⑤ 索引优化实战一
本文深入解析MySQL索引优化原理,涵盖联合索引使用、覆盖索引、索引下推、filesort排序机制及trace工具分析执行计划选择等内容,并结合实际案例提供索引设计原则与SQL优化策略。
104 5
|
20天前
|
机器学习/深度学习 PyTorch API
JAX 核心特性详解:纯函数、JIT 编译、自动微分等十大必知概念
JAX是Google与NVIDIA联合开发的高性能数值计算库,依托XLA实现CPU/GPU/TPU加速,支持自动微分、JIT编译、向量化与并行化。生态丰富,含Flax、Optax等工具,适合深度学习与科学计算。
132 1
|
20天前
|
存储 人工智能 安全
AI驱动数据安全防护体系革新 阿里“天盾”系统实现威胁识别零误报 - 金海境科技
服务器数据恢复,勒索病毒解密恢复,虚拟化数据恢复,数据库修复数据恢复,VMWare数据恢复,分布式数据恢复,vSAN数据恢复,存储数据恢复,数据恢复
|
20天前
|
Java Linux 应用服务中间件
jakarta-tomcat-connectors-jk2-src.tar.gz 安装教程(详细步骤及附安装包)
本文介绍如何编译和配置Tomcat连接器mod_jk2,实现Apache与Tomcat集成。内容包括JDK准备、源码解压、Linux/Mac/Windows平台下的编译方法、Apache模块加载及workers配置,最后通过重启服务并测试验证连接是否成功。适用于需要整合Java应用服务器的场景。(238字)