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,一经查实,立即删除!

相关文章

2024美赛A题思路/代码:资源可用性和性别比例

美赛直播b站,提前关注:川川菜鸟 美赛辅导预定:美赛服务 去年美赛A题作品:2023美赛A题 题目 背景 尽管一些动物物种不属于通常的雄性或雌性,大多数物种在出生时要么显著地为雄性,要么为雌性。虽然许多物…

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,最…

Spring声明式事务

1.概念 事务就是用户定义的一系列执行SQL语句的操作, 这些操作要么完全地执行,要么完全地都不执行, 它是一个不可分割的工作执行单元 一个使用Mybatis-Spring的主要原因是它允许Mybatis参与到Spring的事务管理中,而不是给Mybatis创建一个新的…

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

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

图片热区功能

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

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

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

Docker 容器jar 运行报错 at sun.awt.FontConfiguration.getVersion 解决方法

docker jar 运行报错 at sun.awt.FontConfiguration.getVersion 初步判断是在运行 Docker 容器中的 JAR 文件时遇到了与字体配置相关的问题。这个问题可能是由于容器内缺少字体配置或字体文件而引起的。 要解决这个问题,你可以尝试以下方法: 1.安装字…

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

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

构建云安全防线:企业必备的10大能力解析

云计算技术为现代企业组织带来了可扩展性、灵活性、减少物理基础设施、降低运营成本以及全天候的数据访问等诸多好处。但研究数据也显示,目前只有4%的企业组织能够为云端资产提供充分的安全保护。在2023年,有超过80%的数据泄露事件涉及存储在云端的数据。…

Vue3基本概念

script部分 export default对象的属性: name:组件的名称 components:存储中用到的所有组件 props:存储父组件传递给子组件的数据 watch():当某个数据发生变化时触发 computed:动态计算某个数据 setup(pro…

json文件缺少的语言key的检测

需求 在做多语言的项目的时候,需要对当前不同语言的key的差异进行对比并且找出缺少key的语言和具体的语言key 通过node的文件读取能力进行需求的实现 const fs require(fs) const path require(path); const lodash require(lodash); // 目的是找出多语言文件中…

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

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

解决pandas写入excel时的ValueError: All strings must be XML compatible报错

报错内容: ValueError: All strings must be XML compatible: Unicode or ASCII, no NULL bytes or control characters 报错背景 用pands批量写入excel文件,发生编码报错。检索了很多方案,都不能解决。 导致报错的原因是存在违法字符&…

米贸搜|Facebook公共主页反馈分数(ACE) 更新

前段时间Meta改进了公共主页反馈分数的仪表板,发现有部分广告主似乎没有接受到这条动态,今天为大家整理出更新内容,方便各位广告主了解学习! Meta重新设计了公共主页反馈分数仪表板,以便广告主能更轻松地了解总体反馈…

【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 图表或图形交互式地图复…

《拳皇97》中的人物性格——麻宫雅典娜

在充满热血与激情的《拳皇97》世界中,有一位身披粉红战袍、手持麦克风当武器的女性角色脱颖而出,她就是我们的甜美格斗家——麻宫雅典娜。这位看似柔弱却内藏坚韧的偶像歌手,以其独特的性格魅力和幽默生动的表现方式,在格斗场上演绎了一幕幕让人捧腹又感动的瞬间。 首先,让…