数据库同步工具
sqlserver,Mysql数据同步软件

图解MySQL索引上—MySQL有中“8种”索引

购买事宜请联系QQ:1793040

关于MySQL索引的相关内容,一直是头疼的问题,特别是对于初学者而言。作者已经被困了很长时间,无法区分“覆盖索引,辅助索引,唯一索引,哈希索引,B树索引…” ,导致面试过程中,它进入了一个比较尴尬的境地。

许多人可能会抱怨” 采访过程中制造火箭弹,螺丝钉,很多知识用于采访,而在工作中没有用!“。幸运的是,MySQL中的索引不仅是面试的必要知识,还是工作中最常用的技能。作者认为,该索引是 MySQL最具成本效益的部分

因为MySQL支持多个存储引擎,所以在不同的存储引擎中的实现略有不同。如果下面的索引中没有特殊语句,则默认引用InnoDB存储引擎。

首先,索引是用于有效获取数据的数据结构。就像书中的目录一样,我们可以通过它快速定位数据的位置,从而提高数据查询的效率。

MySQL中有许多术语和概念,对于初学者来说很容易混淆。为了便于理解,我建立了一个表格来尝试阐明这些概念来自特定案例的含义。

哈希索引

如上所述,索引是一种提高查询效率的数据结构,并且有许多可以提高查询效率的数据结构,例如二进制搜索树,红黑树,跳转表,哈希表(哈希表)等等,而MySQL使用B +树和哈希表(Hash table)作为索引的基础数据结构。

应该注意的是,MySQL 不明确支持Hash索引,但作为内部优化,针对热数据将自动生成Hash索引,也称为自适应Hash索引

哈希索引可用于在等效查询中以O(1)时间复杂度定位数据。效率很高,但是不支持范围查询。这种数据结构被许多编程语言和数据库使用,例如Redis支持的Hash数据结构。具体结构如下:

B +树索引

在提及B +树时,我必须首先提及 B树,B树(多路径搜索树,不是二进制)是一种常见的数据结构。使用B树结构可以显着减少定位记录时遇到的中间过程,从而加快访问速度。

B +树是基于B-Tree升级的树数据结构,通常在操作系统的数据库和文件系统中使用。 B +树的特点是可以保持数据稳定有序,并且其插入和修改具有相对稳定的对数时间复杂度。 B +树元素从下至上插入,这与二叉树相反。

MySQL索引的实现也基于这种有效的数据结构。具体的数据结构如下:

作者首先需要声明,不要混淆 B树,B树和B +树。首先,B树是B树,中间的”-“是下划线而不是减号,并且没有” B负树”数据结构。其次,在实现索引时,B +树和B树之间有两个区别。详情请参见下图

①B+树仅将数据存储在叶节点中,而B-Tree数据存储在每个节点中

②B+树的叶节点通过指针链接,通过遍历叶节点可以获得所有数据。

B +树是一种神奇的数据结构。就语言而言可能有点费力。有兴趣的学生可以单击本文结尾处的数据结构可视化工具。经过一番手术,我一定会有所收获。下图是作者。演示B +树的数据插入方法(从下到上)。

根据数据的组织方式,可以将其分为聚簇索引和非聚簇索引(也称为聚簇索引和非聚簇索引)。聚簇索引是根据每个表的主键构造一个B +树,同时,叶节点存储整个表的行记录数据。

在InDB中,聚集索引和主键索引的概念是等效的,MySQL规定每个表必须具有主键索引,主键索引只能具有一个,而不能同时为null必须唯一。如果在构建表时未指定主键索引,则将自动生成一个隐藏字段作为主键索引。

对应的是非聚集索引,非聚集索引也可以称为非主键索引,辅助索引,辅助索引。主键索引的叶节点存储完整的数据行,非主键索引的叶节点存储主键索引值。 通过非主键索引查询数据时,将首先找到主键索引,然后转到主键索引以查找对应的数据。此过程称为返回表(以下将再次提及)。

应该添加的是,索引和数据文件分别存储在MyISAM中,并且所有索引都是非聚集索引。 B +树的叶节点存储存储数据的地址而不是特定数据。

为了应付不同的数据检索需求,索引只能同时包含一个字段或多个字段。由单个字段组成的索引可以称为单值索引,否则称为复合索引(或组合索引或多值索引)。上面演示了单值索引,因此接下来将复合索引作为比较。

复合索引的索引的数据顺序与字段的顺序有关。在包含多个值的索引中,如果重复当前字段的值,则会根据其后面的值对其进行排序。

唯一索引

唯一索引,不允许具有相同索引值的行,因此禁止重复的索引或键值。系统在创建索引时检查是否存在重复的键值,并在每次使用INSERT或UPDATE语句添加数据时检查。如果存在重复的值,则操作将失败并引发异常。

应该注意,主键索引必须是唯一索引,并且唯一索引不一定是主键索引。 唯一索引可以理解为简单地将索引设置为唯一属性

覆盖索引

如上所述,返回表的概念。如果通过非主键索引查询数据,则将首先查询主键索引的值,然后转到主键索引以查询特定数据。整个查询过程需要扫描两次索引,显然回到表是一项耗时的操作。

为了减少返回表的次数,在设计索引时,我们可以让索引包含要查询的结果,然后在检索索引中的数据后直接返回辅助索引,无需执行表返回操作。

但应注意,使用覆盖索引的前提是字段长度相对较短。对于具有长值长度的字段,不适合使用覆盖索引。原因有很多,例如索引通常存储在内存中。较大的磁盘可能会从磁盘加载,从而影响性能。当然还有其他原因,具体情况将在下一篇文章中介绍。

本文从不同的方面介绍了MySQL中的索引。索引可以用许多名称划分为不同的维度,但是需要明确的一个问题是索引的本质是数据结构,其他索引的划分是针对实际应用的。具体分类如下所示:

目的是让每个人对索引都有一个初步而清晰的了解,并解决 What 问题。后续操作将重点放在为什么为何上,当然,首先,它应该能够区分本章文章中描述的概念性问题。

数据结构可视化工具:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

1.为什么MySQL索引为什么使用B +树而不是搜索二进制树,红黑树或跳转表?

这是一个综合性的问题,远远不止如此简单,朋友们可以在消息区域中写出答案我们一起讨论,作者将重点关注为什么,以及如何使用正确索引。

未经允许不得转载:数据库同步软件|Mysql数据同步软件|sqlserver数据库同步工具|异构同步 » 图解MySQL索引上—MySQL有中“8种”索引

分享到:更多 ()

syncnavigator 8.6.2 企业版

联系我们联系我们