MySQL索引的原理和SQL优化策略

1. 索引

在InnoDB存储引擎中,索引分为聚簇索引和辅助索引两种类型。

聚簇索引是指基于表的主键构建的索引,它决定了表中数据的物理存储顺序。也就是说,聚簇索引中的键值按照主键的顺序来排序,并且每个叶子节点存储的是整个表行的数据。因此,通过聚簇索引可以快速地定位到特定主键的行数据,而且相邻的行数据在物理上也是相邻存储的。如果表没有主键,则InnoDB会选择一个唯一的非空索引作为聚簇索引,如果没有这样的索引,则会隐式地创建一个隐藏的主键。

辅助索引是指除了聚簇索引以外的其他索引,它们的叶子节点存储的是主键值和指向对应行数据的指针。因此,通过辅助索引可以快速地定位到符合特定条件的行数据,并且可以使用覆盖索引避免访问聚簇索引中的行数据。辅助索引可以有多个,每个辅助索引都有自己的B+树结构。

需要注意的是,聚簇索引和辅助索引在物理上是相互独立的。如果同时使用多个辅助索引,每个索引都需要单独维护一个B+树结构,这可能会影响写入性能。此外,在使用辅助索引时,需要特别注意覆盖索引和最左前缀索引的使用,以保证查询性能的最大化。
InnoDB必须有一个主键
在这里插入图片描述

InnoDB的表为什么必须有一个主键?
聚集索引B+树。
在InnoDB存储引擎中,表中的数据是按照主键索引的B+树结构进行组织的,每行数据对应B+树中的一个叶子节点。这种结构使得InnoDB能够高效地支持基于主键的数据访问和查询操作。

InnoDB中的B+树

B+树:多路平衡搜索树
所有叶子节点都在同一层
叶子节点构成了一个双向链表
结点的大小都是16K

为什么选择B+树?
降低磁盘IO次数,树相对矮胖
便于支持范围查询

索引使用场景(看col所在列是否设置了索引,有就使用)

  1. where col
  2. group by col
  3. order by col

不会使用索引的场景
4. 没有使用上面三个的时候
5. 区分度不高的列
6. 经常修改的列不使用索引(修改的话要改树,维护代价很高)
7. 数据量少的表,没必要创建

2.约束

在这里插入图片描述
外键约束
示例如下:
在这里插入图片描述
在这里插入图片描述

覆盖索引

覆盖索引:一种数据查询方式,针对辅助索引,直接通过辅助索引的B+树就能找到我们要查找的内容,无需再进行回表查询。

覆盖索引是一种特殊的索引,它包含了查询所需的所有列,而不仅仅是索引列。当一个查询可以通过覆盖索引完全满足时,就不需要进行回表查询。

在传统的查询中,当使用非覆盖索引时,数据库需要根据索引找到匹配的行,并通过回表操作去访问主表来获取其他列的值。这个过程会增加额外的磁盘I/O和CPU开销。

相比之下,覆盖索引可以避免回表操作。因为覆盖索引已经包含了查询所需的所有列,数据库可以直接从索引中获取所需的数据,而不需要再次访问主表。这样可以显著提高查询性能,减少了不必要的磁盘I/O和CPU开销。

使用覆盖索引可以有效地减少查询的响应时间,特别是对于那些只需要部分列数据的查询。然而,覆盖索引也有一些限制,例如索引列的长度和数量等。在设计数据库时,需要根据具体的业务需求和查询模式来合理选择是否使用覆盖索引。

尽量不使用select * ,只写我们需要的字段。

最左匹配规则

在MySQL中,最左匹配规则是指当使用复合索引(即包含多个列的索引)进行查询时,MySQL会从左到右依次匹配索引的列,并且只有在前面的列都有匹配条件时,才能使用后面的列进行进一步的筛选。

具体来说,如果创建了一个复合索引 (col1, col2, col3),那么在查询时,MySQL将首先尝试使用 col1 进行匹配。只有当查询中包含了 col1 的条件时,索引才会被用到。如果查询中没有 col1 的条件,那么索引将无法使用。

如果查询中有 col1 的条件,MySQL 将根据剩余的条件继续匹配 col2,然后是 col3。只有在前面的列都有匹配条件的情况下,才能使用后面的列进行进一步的筛选。

这意味着,如果要充分利用复合索引的最左匹配规则,需要确保查询条件中的列与索引的列按照相同的顺序,并且从左到右逐渐添加条件。

举个例子,假设有一个复合索引 (col1, col2, col3),如果查询条件中只有 col2col3 的条件,而没有 col1 的条件,那么该索引将无法使用。因为最左匹配规则要求必须从索引的最左边开始进行匹配。

因此,在设计和优化索引时,了解最左匹配规则对于正确选择索引和编写高效的查询语句是非常重要的。

索引下推(面试会问)

索引下推(Index Condition Pushdown)是MySQL中的一种优化技术,用于在执行查询时将过滤条件尽可能地下推到存储引擎层级进行处理。

在传统的查询执行过程中,MySQL会首先根据WHERE子句中的条件从表中检索出满足条件的行,然后再应用其他的过滤条件。这意味着MySQL需要从磁盘中读取大量的数据,然后在服务器层级上进行进一步的过滤。

而索引下推的优化技术可以在存储引擎层级上进行更早的过滤操作。当查询包含了索引列和其他非索引列的条件时,MySQL可以将非索引列的过滤条件下推到存储引擎层级进行处理。这样,在读取磁盘数据之前就能进行更精确的过滤,减少了不必要的磁盘I/O和数据传输量

通过索引下推,MySQL可以最大限度地利用索引来提高查询性能。它可以减少从磁盘读取的数据量,降低CPU和内存的使用,从而加快查询的执行速度。

需要注意的是,索引下推并不是对所有类型的查询都适用。它主要适用于那些包含了索引列和其他非索引列条件的查询语句。此外,索引下推的效果也取决于存储引擎的具体实现和版本。

综上所述,索引下推是MySQL中的一种优化技术,通过将非索引列的过滤条件下推到存储引擎层级进行处理,以减少不必要的磁盘I/O和数据传输量,从而提高查询性能。

可以用EXPLAIN查看SQL语句是否索引下推了
如下图所示:
在这里插入图片描述

没有索引下推机制的话,server+存储引擎,server向引擎存储数据,在server层根据条件判断进行数据的过滤。
有了索引下推,存储引擎会过滤数据,最终将数据返回。

索引下推的实现方式通常涉及数据库查询优化器和存储引擎的协作。当查询到达数据库系统时,优化器会分析查询并确定哪些过滤条件可以下推到存储引擎层。然后,优化器会生成一个优化后的执行计划,其中包括下推的过滤条件。

存储引擎在执行查询时,会根据优化器生成的执行计划,利用下推的过滤条件来减少需要读取和处理的数据量。这通常涉及存储引擎利用索引来快速定位和过滤数据,以及在存储引擎层面进行进一步的优化操作,例如减少不必要的数据传输和处理。

总的来说,索引下推的实现依赖于数据库系统的查询优化器和存储引擎的协作,以及对查询执行计划的优化和索引的有效利用,从而实现减少数据传输和处理的优化效果。

在数据库管理系统中,缓冲池(Buffer Pool)是用于存储数据库中的数据页的内存区域。它充当了磁盘和内存之间的缓冲区,以提高数据库的读取性能。

缓冲池中的数据是通过页(Page)进行组织的。每个页代表了数据库中的一个固定大小的块,通常是4KB或8KB。这些页包含了数据库中的实际数据和元数据。

当数据库需要从磁盘读取数据时,它首先检查缓冲池中是否已经存在所需的页。如果该页已经在缓冲池中,则可以直接从内存中获取数据,而无需访问磁盘。这样可以大大加快数据的读取速度。

如果所需的页不在缓冲池中,数据库管理系统将从磁盘读取该页,并将其放入缓冲池中。为了有效地管理缓冲池中的数据,通常使用一种称为LRU(Least Recently Used,最近最少使用)的算法来替换最久未使用的页。

缓冲池的大小是可配置的,它取决于系统的可用内存和数据库的需求。较大的缓冲池可以容纳更多的数据页,从而减少磁盘读取的频率,提高数据库的整体性能。然而,过大的缓冲池可能会导致内存不足的问题,因此需要根据具体情况进行权衡和配置。

总而言之,缓冲池中的数据是通过页进行组织的,它提供了一个高效的方式来管理数据库中的数据页,并加速数据库的读取操作。

在MySQL数据库中,Change Buffer(变更缓冲区)是一种用于提高写入性能的机制。它主要用于延迟将数据页的修改操作写入磁盘,而是先将这些修改操作记录在Change Buffer中。

当执行更新操作(如插入、删除或更新行)时,MySQL会将这些修改操作记录到Change Buffer中,而不是立即将其写入磁盘。这样可以减少对磁盘的随机写入操作,从而提高写入性能。

Change Buffer是以页为单位进行组织的,每个页都有一个对应的Change Buffer。当需要读取某个页的数据时,MySQL首先检查Change Buffer中是否存在该页的未写入的修改操作。如果有,MySQL会将Change Buffer中的修改应用到内存中的页上,然后返回修改后的数据给用户。

定期地,MySQL会将Change Buffer中的修改操作合并(Merge)到磁盘上的实际数据页中。这个过程通常发生在后台,并且在系统负载较低的时候进行。合并操作的目的是保持数据的一致性,并确保数据在重启之后仍然可用。

Change Buffer的使用可以有效减少磁盘的随机写入操作,提高写入性能。尤其在具有大量随机写入操作的工作负载下,Change Buffer的优化效果更为显著。然而,Change Buffer也会占用一定的内存空间,并且在某些情况下可能导致额外的磁盘I/O负载。

因此,在配置MySQL时,需要根据具体的工作负载和硬件条件来合理设置Change Buffer的大小,以平衡性能和资源消耗。

索引失效

  1. 左模糊
  2. 索引参与了运算:使用函数,进行表达式运算,隐式转换
  3. where or了非索引;in

索引原则

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

慢SQL

在这里插入图片描述
如何开启慢查询日志
在这里插入图片描述

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

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

相关文章

HAL库配置PWM模式

一、什么是PWM 脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制。通过控制高低电平在一个周期内的占比从而输出一定的电压。 向上计数原理介绍 ​PWM的一个周期 定时器从0开始向上计数 当0-t1段,定时器计数器TIMx_CNT值小于…

直播团队职责

一、内容策划 直播团队的内容策划人员是整个直播活动的核心,他们需要负责策划直播的主题、内容、形式以及时间安排等。同时,他们还需要负责邀请嘉宾、安排活动等,确保直播内容丰富、有趣、有价值。 二、主播管理 主播是直播活动的关键人物…

unity WebGL发布游戏生成WebGL

1.unty Hub中安装WEBGL支持 2.项目平台的切换 color space需要根据项目选择 ColorSpace,是指玩家设置的颜色空间。 伽马颜色空间是历史悠久的标准格式,但线性颜色空间渲染可提供更精确的结果。 具体区别:ColorSpace 3.由于没有自己服务器…

壹[1],Xamarin开发环境配置

1,环境 VS2022 注: 1,本来计划使用AndroidStudio,但是也是一堆莫名的配置让人搞得很神伤,还是回归C#。 2,MAUI操作类似,但是很多错误解来解去,且调试起来很卡。 3,最…

如果你也觉得自己不够聪明,也缺乏才华。。。

​在追求成功的道路上,我们常常自我怀疑,感觉自己不够聪明,缺乏必要的才华。然而,正是这种自我感知,如果处理得当,可以成为我们最大的优势。这篇文章旨在为那些怀疑自己的能力,但依然渴望在工作…

图片热区功能

一、需求描述及效果图 1.需求描述: 根据后端返回的坐标及人员信息,在图片上的相应位置添加图片热区功能,点击可展示出对应的人员信息。 图片可进行缩放 2.示例: (定位是随便写的,仅做示例) …

Mac用Crossover玩《幻兽帕鲁》手柄不能用怎么办? Mac电脑玩《幻兽帕鲁》怎么连接手柄? 幻兽帕鲁玩家超1900万

2024年首款爆火Steam平台的游戏《幻兽帕鲁》,在使用Crossover后可以用Mac系统玩了,很多玩家喜欢通过手柄玩游戏,它拥有很好的握持体验,长时间玩也不会很累,所以很多《幻兽帕鲁》玩家都喜欢用手柄来操作,很多…

史上最全知识图谱建模实践(下):多元关系架构

在“知识图谱之本体结构与语义解耦——基于OpenSPG的建模实践(上)”一文中,我们从实体关系设计和概念语义建模2种场景,讲解了基于SPG的知识建模的方法和案例。 本文中,我们将继续讲解多元关系架构场景中的知识建模实践…

基于C/C++的MFC的IDC_MFCEDITBROWSE2控件不显示ico问题记录

打开资源文件 *.rc文件 ,在最上方添加 #if !defined(_AFXDLL) #include "afxribbon.rc" // MFC ribbon and control bar resources #endif 如下图所示:

【INTEL(ALTERA)】为什么 F-tile Serial Lite IV FPGA IP 设计示例会失败

说明 由于Intel Agilex 7 FPGA I 系列收发器-SoC 开发套件的时钟控制器 GUI 存在问题,当您需要配置芯片 Si5332 的 OUT1 时钟频率时,您可能会发现 F-tile Serial Lite IV 英特尔 FPGA IP设计示例失败。这是因为此 Si5332 GUI 存在问题;无法准确配置 OUT…

8. Threejs案例-SVG渲染器和WEBGL渲染器对比

8. Threejs案例-SVG渲染器和WEBGL渲染器对比 实现效果 知识点 SVG渲染器 (SVGRenderer) SVGRenderer 被用于使用 SVG 来渲染几何数据,所产生的矢量图形在以下几个方面十分有用: 动画标志 logo 或者图标 icon可交互的 2D 或 3D 图表或图形交互式地图复…

【C++11(一)】列表初始化and右值引用

一、 统一的列表初始化 1.1 {}初始化 在C98中,标准允许 使用花括号{}对数组或者结构体元素 进行统一的列表初始值设定 C11扩大了用大括号 括起的列表(初始化列表)的使用范围 使其可用于所有的内置类型和 用户自定义的类型 使用初始化列表时…

nginx反向代理----->微服务网关----->具体微服务

今天,做项目的时候做项目的时候配路由出现bug,特此理顺一下从nginx到微服务网关再到微服务这一过程。 nginx配置 upstream admin-gateway{server localhost:21217; }server {listen 8803;location / {root F:/develop/admin-web/;index index.html;}…

十六、Vben框架table内部合并行

在vben项目中合并内部的行是一个常规的操作,以前我们说过如果是一条数据内部只需要分割拿高撑开就可以实现,在第三章的时候我们已经讲过了,那么如果是不定的条数合并为一条数据呢,怎么能够实现呢,下面我们就来讲讲。 先看效果图 如图,能看到是三条数据,其实是…

【Django-ninja】django ninja中使用查询过滤器FilterSchema

Django ORM中过滤器 filter的基本用法 filter() 是 QuerySet 对象的一个方法,用于从数据库中过滤数据。它接受一个或多个关键字参数,每个参数都表示一个查询条件,它们之间是 AND 关系。 以下是 filter() 方法的基本用法示例: fr…

基于springboot+vue的旅游管理系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 研究现状…

Flutter 各种Demo效果合集

Flutter 各种Demo实现效果: github:GitHub - PangHaHa12138/FlutterDemo: Flutter 各种Demo效果合集 1:2种 仿朋友圈 效果,顶部拉伸 和 不拉伸 2:仿抖音上下滑动视频播放 3:视频直播(使用的电视台的m3u…

Apache SeaTunnel (不含web) Window11 本机搭建(非源码)

启动环境 需要提前准备的(只提供作者试过且可行的方案) window11ubuntu20(wsl2) window11内置ubuntu的方式自行百度,此处不做陈述jdk8mysql8navicatvscode 环境准备不做过多陈述,以下是正式的安装启动步骤 SeaTunnel 2.3.3 资源准备 第一步: 创建文件…

Task05:PPO算法

本篇博客是本人参加Datawhale组队学习第五次任务的笔记 【教程地址】https://github.com/datawhalechina/joyrl-book 【强化学习库JoyRL】https://github.com/datawhalechina/joyrl/tree/main 【JoyRL开发周报】 https://datawhale.feishu.cn/docx/OM8fdsNl0o5omoxB5nXcyzsInGe…

2024年混合云:趋势和预测

混合云环境对于 DevOps 团队变得越来越重要,主要是因为它们能够弥合公共云资源的快速部署与私有云基础设施的安全和控制之间的差距。这种环境的混合为 DevOps 团队提供了灵活性和可扩展性,这对于大型企业中的持续集成和持续部署 (CI/CD) 至关重要。 在混…