MySQL小知识:为何从8.0开始取消了MySQL查询缓存

news2024/9/22 3:48:36

前言

缓存是对系统性能优化的重要手段。但是有经验的DBA都建议生产环境中把MySQL Query Cache关闭。MySQL8.0更是直接取消了查询缓存。
一键获取MySQL核心数据结构、底层实现原理、索引、事务、锁机制、MySQL性能优化案例、美团MySQL中间件等。

这是为什么?查询缓存在使用中遇到了什么坑?带着如下几个问题,我们正式进入本文。

  • 什么是MySQL查询缓存?
  • MySQL缓存规则。
  • MySQL缓存的优缺点。
  • MySQL缓存对性能的影响。

在这里插入图片描述

什么是查询缓存

MySQL体系架构
在这里插入图片描述
为了提高完全相同的Query语句的响应速度,MySQL Server会对查询语句进行Hash计算后,把得到的hash值与Query查询的结果集对应存放在Query Cache中。

如果没有匹配,将这个hash值存放在一个hash链表中,并将Query的结果集存放到cache中。
如果通过hash值匹配到了一样的Query,则直接将cache中相应的Query结果集返回给客户端。
目前MySQL Query Cache只会cache select语句,其他类似show ,use的语句不会被cache

MySQL缓存管理和配置

在这里插入图片描述

have_query_cache: 该MySQL Server是否支持Query Cache。

query_cache_limit: MySQL能够缓存的最大查询结果,查询结果大于该值时不会被缓存。

query_cache_min_res_unit: 查询缓存分配的最小块的大小(字节)。

当查询进行的时候,MySQL把查询结果保存在qurey cache中,但如果要保存的结果比较大,超过query_cache_min_res_unit的值 ,这时候mysql将一边检索结果,一边进行保存结果,也就是说,有可能在一次查询中,mysql要进行多次内存分配的操作。适当的调节query_cache_min_res_unit可以优化内存。

query_cache_size: 为缓存查询结果分配的内存的数量,单位是字节,且数值必须是1024的整数倍。默认值是0,即禁用查询缓存。

query_cache_type: 设置查询缓存类型,默认为ON。设置GLOBAL值可以设置后面的所有客户端连接的类型。客户端可以设置SESSION值以影响他们自己对查询缓存的使用。

下面的表显示了可能的值:
在这里插入图片描述

query_cache_wlock_invalidate:如果某个表被锁住,是否返回缓存中的数据,默认关闭,也是建议的。

MySQL缓存规则

MySQL缓存机制简单的说就是缓存sql文本及查询结果,如果运行完全相同的SQL,服务器直接从缓存中取到结果,而不需要再去解析和执行SQL。

如果表中任何数据或是结构发生改变,包括INSERT、UPDATE、DELETE、TRUNCATE、ALTER TABLE、DROP TABLE或DROP DATABASE等,那么使用这个表的所有缓存查询将不再有效,查询缓存中值相关条目被清空。

显然,这对于频繁更新的表,查询缓存是不适合的。

缓存规则:

将查询语句和结果集返回到内存,下次再查直接从内存中取;
sessions共享,一个client查询的缓存结果,另一个client也可以使用;
SQL必须完全一致才会导致cache命中;
不确定的函数将永远不会被cache, 比如current_date, now等;
太大的result set不会被cache (< query_cache_limit);
MySQL缓存在分库分表环境下是不起作用的;
执行SQL里有触发器,自定义函数时,MySQL缓存也是不起作用的;
在表的结构或数据发生改变时,基于该表相关cache立即全部失效。

缓存机制中的内存管理

  • MySQL Query Cache 使用内存池技术,自己管理内存释放和分配,而不是通过操作系统。内存池使用的基本单位是变长的block,
    用来存储类型、大小、数据等信息;一个result
    set的cache通过链表把这些block串起来。block最短长度为query_cache_min_res_unit。

  • 当服务器启动的时候,会初始化缓存需要的内存,是一个完整的空闲块。当查询结果需要缓存的时候,先从空闲块中申请一个数据块为参数query_cache_min_res_unit配置的空间,即使缓存数据很小,申请数据块也是这个,因为查询开始返回结果的时候就分配空间,此时无法预知结果多大。

  • 分配内存块需要先锁住空间块,所以操作很慢,MySQL会尽量避免这个操作,选择尽可能小的内存块,如果不够,继续申请,如果存储完时有空余则释放多余的。

  • 但是如果并发的操作,余下的需要回收的空间很小,小于query_cache_min_res_unit,不能再次被使用,就会产生碎片。

查询缓存的优缺点

优点:

Query Cache的查询,发生在MySQL接收到客户端的查询请求、查询权限验证之后和查询SQL解析之前。

也就是说,当MySQL接收到客户端的查询SQL之后,仅仅只需要对其进行相应的权限验证之后,就会通过Query Cache来查找结果,甚至都不需要经过Optimizer模块进行执行计划的分析优化,更不需要发生任何存储引擎的交互。

由于Query Cache是基于内存的,直接从内存中返回相应的查询结果,因此减少了大量的磁盘I/O和CPU计算,导致效率非常高。

缺点:

MySQL会对每条接收到的SELECT类型的查询进行hash计算,然后查找这个查询的缓存结果是否存在。虽然hash计算和查找的效率已经足够高了,一条查询语句所带来的开销可以忽略,但一旦涉及到高并发,有成千上万条查询语句时,hash计算和查找所带来的开销就必须重视了。
Query Cache的失效问题。如果表的变更比较频繁,则会造成Query Cache的失效率非常高。表的变更不仅仅指表中的数据发生变化,还包括表结构或者索引的任何变化。
查询语句不同,但查询结果相同的查询都会被缓存,这样便会造成内存资源的过度消耗。查询语句的字符大小写、空格或者注释的不同,Query Cache都会认为是不同的查询(因为他们的hash值会不同)。
相关系统变量设置不合理会造成大量的内存碎片,这样便会导致Query Cache频繁清理内存。

对性能的影响

读查询开始之前必须检查是否命中缓存。
如果读查询可以缓存,那么执行完查询操作后,会查询结果和查询语句写入缓存。
当向某个表写入数据的时候,必须将这个表所有的缓存设置为失效,如果缓存空间很大,则消耗也会很大,可能使系统僵死一段时间,因为这个操作是靠全局锁操作来保护的。
对InnoDB表,当修改一个表时,设置了缓存失效,但是多版本特性会暂时将这修改对其他事务屏蔽,在这个事务提交之前,所有查询都无法使用缓存,直到这个事务被提交,所以长时间的事务,会大大降低查询缓存的命中。

生产如何设置MySQL Query Cache

MySQL中的Query Cache是一个适用较少情况的缓存机制。如果你的应用对数据库的更新很少,那么QC将会作用显著。比较典型的如博客系统,一般博客更新相对较慢,数据表相对稳定不变,这时候QC的作用会比较明显。

但是一个更新频繁系统。Query Cache缓存的作用是很微小的,如果应用层能够实现缓存,将可以忽略Query Cache的效果。所以,如果经常有更新的系统,想要获得较高tps的话,建议一开始就关闭Query Cache

查询缓存的替代方案MySQL查询缓存工作的原则是:执行查询最快的方式就是不去执行,但是查询仍然需要发送到服务器端,服务器也还需要做一点点工作,如果对于某些查询完全不需要与服务器通信效果会如何呢,这时客户端缓存可以很大程度上分担MySQL服务器的压力。

最后

在这里插入图片描述

👇🏻 添加 博主 获取图中PDF文档 👇🏻

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/67934.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]Python计算机毕业设计Django微信点餐系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

HTTP的请求方式有哪些?

文章目录HTTP的请求方式1. GET方法2. HEAD方法3. POST方法4. PUT方法5. DELETE方法6. CONNECT方法7. OPTIONS方法8. TRACE方法HTTP的请求方式 在 HTTP/1.1 中提供了一系列方法以便我们向服务器发送不同类型的请求&#xff0c;需要注意的是这些方法名称都是区分大小写的&#xf…

【吴恩达机器学习笔记】十四、推荐系统

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4e3;专栏定位&#xff1a;为学习吴恩达机器学习视频的同学提供的随堂笔记。 &#x1f4da;专栏简介&#xff1a;在这个专栏&#xff0c;我将整理吴恩达机器学习视频的所有内容的笔记&…

TensorFlow之分类模型-1

1 基本概念 机器学习 机器学习是指一段程序或者和一个系统从输入数据中训练一个模型。完成训练的模型可以对全新的数据进行预测&#xff0c;其中&#xff0c;新数据的分布是与被训练数据的分布保持一致。 训练 一个确定组成模型的实际参数的过程&#xff0c;这些参数包括权…

Linux | 为什么要有线程?| 线程概念 | 线程控制 | 线程ID的实质

文章目录为什么要有线程&#xff1f;Linux对于线程的设计Linux线程特点总结Linux线程和进程的比较线程的优点线程的缺点Linux下线程的使用线程的创建与销毁线程退出的三种方式什么是线程ID&#xff1f;线程局部存储线程分离exit对于线程的影响为什么要有线程&#xff1f; 假设…

二手书籍交易网站毕业设计,二手书籍买卖平台毕设,二手书籍交易市场平台设计与实现毕业设计论文分析

项目背景和意义 目的&#xff1a;本课题主要目标是设计并能够实现一个基于web网页的校园二手书籍交易系统&#xff0c;整个网站项目使用了B/S架构&#xff0c;基于python的Django框架下开发&#xff1b;用户通过登录网站&#xff0c;查询二手交易商品&#xff0c;购买二手交易网…

分享107个竞聘述职PPT模板,总有一款适合您

链接&#xff1a;https://pan.baidu.com/s/1snFUpkECYjvFEk0d3kNHiw?pwd87pd 提取码&#xff1a;87pd 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c;大家下载后可以看到。 个人工作述职报告ppt范文免费下载 年终竞…

密集计算场景下的 JNI 实战

在 Java 发展历程中&#xff0c;JNI 一直都是一个不可或缺的角色&#xff0c;但是在实际的项目开发中&#xff0c;JNI 这项技术应用的很少。在笔者经过艰难的踩坑之后&#xff0c;终于将 JNI 运用到了项目实战&#xff0c;本文笔者将简单介绍 JNI 技术&#xff0c;并介绍简单的…

Gateway之限流、熔断,Sentinel--服务容错

目录 高并发带来的问题 1.编写java代码 2.修改配置文件中tomcat的并发数 3.接下来使用压测工具,对请求进行压力测试 压测工具 服务雪崩效应 常见容错方案 常见的容错组件 Sentinel入门 什么是Sentinel Sentinel 具有以下特征: Sentinel 分为两个部分: sentinel简单模…

[附源码]Python计算机毕业设计Django小区物业管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

如何在 Windows 10 上启用和设置 BitLocker 加密

启用和设置 BitLocker 加密 通过控制面板启用 BitLocker通过命令提示符启用 BitLockerBitlocker 可以使用控制面板中的图形界面或在命令提示符中执行一些命令来启用。在 Windows 10 上启用 Bitlocker 非常简单,但用户通常更喜欢通过控制面板而不是命令提示符来管理 Bitlocker …

python数据类型(1)

关于Python的数据类型 Python数据类型包括&#xff1a; 数字类型&#xff0c;字符类型&#xff0c;布尔类型&#xff0c;空类型&#xff0c;列表类型&#xff0c;元组类型&#xff0c;字典类型 1、数字类型 包括&#xff1a;整型int 浮点型float(有小数位的都是是浮点型) 注…

目标检测常见数据增强算法汇总讲解(Mixup,Cutout,CutMix,Mosaic)

在学习目标检测算法的过程中&#xff0c;发现了一些有趣的目标检测算法&#xff0c;打算简单写个笔记&#xff0c;不足之处还望谅解&#xff0c;可以在评论中指出来。 目标检测作为需要大量数据的算法&#xff0c;在实际情况中经常面临数据不足的情况&#xff0c;事实上很多时候…

JavaScript同步与异步

JavaScript采用单线程模式工作的原因&#xff1a;JavaScript设计之初是为了能够运行在浏览器实现页面交互&#xff0c;而实现页面交互的核心是操作DOM&#xff0c;这种模式就决定了它使用单线程模式&#xff0c;否则就需要解决复杂的多线程同步的问题。 这种模式的优点就是更安…

Vue3中 子组件内v-model绑定props接收到参数时报错update:modelValue

开发过程中二次封装了一个搜索的组件&#xff0c;子组件内使用了el-select和el-input 参数分别对应父组件传入的selectValue和selectText参数 子组件内部change和input事件来同步触发组件中数据的修改 最终本地开发环境一切正常&#xff0c;部署到测试环境和生产环境后出现下…

[附源码]JAVA毕业设计仁爱公益网站(系统+LW)

[附源码]JAVA毕业设计仁爱公益网站&#xff08;系统LW&#xff09; 项目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&…

判断一份好的问卷有哪些标准?

问卷的主要由三个部分组成&#xff1a;问卷说明、问卷主题、问卷结束。而这三个部分又包含了很多因素&#xff0c;比如问卷主题、问卷标题、问卷题目、问卷调查对象等。制作问卷不仅仅是简单的问题罗列&#xff0c;然后进行发放。不同质量的调查问卷会反馈出不一样的效果&#…

Spring Cloud微服务之eureka+client入门

Spring Cloud微服务之eurekaclient入门 谈到服务&#xff0c;想到一种“懒人思维”。家政服务为懒人收拾家务提供一种便利&#xff0c;快餐服务为不爱做饭的懒人提供一种方便.....等等。 说到微服务&#xff0c;顾名思义&#xff0c;就是把服务再细微化。比如需要送女友一束花…

FastReport Desktop 2023Microsoft SQL存储过程的支持

FastReport Desktop 2023Microsoft SQL存储过程的支持 添加了用于从JasperReports转换报告的模板。 添加了对连接到Microsoft SQL存储过程的支持。 在RTF中&#xff0c;添加了一项设置&#xff0c;以提高打印时的图像质量。 添加了导出到Microsoft Excel 2007时从“货币”转换为…

Landsat数据下载

Landsat数据下载步骤0 Landsat数据介绍1 下载地址2 下载步骤2.1 检索数据2.1.1 设置地点&#xff0c;有多种方法2.1.2 选择时间范围2.1.3 在Data Sets界面选择传感器&#xff08;卫星或者传感器的名称&#xff09;2.2 限定云量2.3 下载数据这是个老生常谈的话题了&#xff0c;我…