当前位置: 首页 > 网络应用技术

-Depth分析中的MySQL索引(收集版)

时间:2023-03-07 21:43:04 网络应用技术

  MySQL数据库应该是最常用的数据库之一。在各种大型和小型公司中,它可以看到其数字。您如何掌握MySQL数据库?如果您想更好地使用它,那么我们必须首先理解它。由于所谓的工作希望变得良好,我们必须首先使其工具受益。

  本文导致每个人都深入分析MySQL索引的一些知识。首先,让我们了解索引是什么,以及索引存储模型的扣除。为什么基础数据结构选择B+树的原因?

  一张表具有500万个数据,并且在“名称”字段上执行查询而没有索引:

  如果名称字段上有索引?在名称字段上创建索引,然后执行相同的查询。

  与索引查询和无索引查询相比,效率是数十倍。

  通过这种情况,每个人都应该能够非常直观地感觉到数据检索索引的性能非常好。

  那么索引到底是什么?为什么我们能对我们的查询产生如此巨大的影响?创建索引时发生了什么?

  数据库索引是数据库管理系统(DBMS)中的一个分类数据结构,以帮助快速查询和更新数据库表中的数据。

  数据以文件的形式存储在磁盘上,每条数据行都有其磁盘地址。如果没有索引,我们需要从500万行数据中检索数据,我们只能遍历所有数据该表直到找到此数据为止。

  但是在有索引之后,我们只需要在索引中检索这些数据,因为它是一种特殊的数据结构,专门用于快速检索数据结构。找到数据存储的磁盘地址后,我们可以获取数据。

  在InnoDB中,有三种类型的索引:普通索引,唯一索引(主键索引是特殊索引)和完整的文本索引。

  正常:它也称为非唯一索引,这是最常见的索引,而没有任何限制。

  唯一(唯一):唯一需要重复键值的索引。此外,应注意的是,主密钥索引是一个特殊的唯一索引。它还具有额外的条件条件,需要密钥值不要为空。主键是由Primay键创建的。

  FullText:例如,对于相对较大的数据,我们存储消息内容。有一些KB数据。如果要解决低像查询效率的低点问题,则可以创建一个完整的文本索引。只有文本-Type字段可以创建完整的文本索引,例如char,varchar和text。

  索引是数据结构,因此应选择哪些数据结构以实现有效的数据搜索?

  十一次过去了,你的女友和你玩了一场比赛。

  10000?low.30000?更高。您接下来会猜到多少?20000年。为什么您不猜到11000或29000?

  这是对两个点搜索的一种想法。它也称为半搜索。每次,我们都将候选数据减少了一半。如果数据已放电,则此方法相对有效。

  因此,第一个,我们可以考虑使用有序的组作为索引的数据结构。

  有序数组的等效查询和比较查询效率很高,但是在更新数据时会出现问题。可能有必要移动大量数据(更改索引),因此仅适用于存储静态数据。

  为了支持频繁的修改,例如插入数据,我们需要使用链接列表。在链接列表中,如果它是单个链接列表,则其搜索效率仍然不够高。

  那么,是否有链接列表可以在双点中找到?

  为了解决这个问题,BST(二进制[?ba?n?ri]搜索树)是我们所说的二进制搜索树。

  左Zishu的所有节点都比父节点小,并且右子树的所有节点都大于父节点。在对平面投影后,它是有序的线性表。

  二进制搜索树不仅可以实现快速搜索,还可以实现快速插入。

  但是,二进制搜索树存在一个问题:耗时与该树的深度有关。在最坏的情况下,时间复杂性将退化为o(n)。

  最坏的情况是什么?

  仍然是现在数量的数量,如果我们刚刚插入数据,2、10、12、15、21、28

  目前,BST将成为链接列表(“斜树”)。在这种情况下,它无法实现加快检索速度的目的,并且与顺序搜索效率没有区别。

  它的原因是什么?

  由于左右树的深度太大,因此这棵树的左子树根本没有节点 - 也就是说,它的平衡不足。

  因此,我们没有不同的树木深度,它不是那么平衡吗?

  这是一棵平衡的二进制树,称为平衡的二进制搜索树或AVL树。

  平衡二进制树的定义:左右树深度的绝对值不能超过1。

  这是什么意思?例如,左子树的深度是2,右子树的深度只能是1或3。

  目前,我们按顺序插入了1、2、3、4、5、6,它一定是这样,它不会成为“斜树”。

  那么如何完成AVL树的平衡?如何确保左右树的深度差异可以超过1?例如:插入1、2、3。

  在插入1或2之后,如果我们根据二进制看树的定义,则必须在2的右侧。此时,根节点1的右节点的深度将变为2,但是左节点的深度为0。由于它没有子节点,因此会违反二进制树的定义。

  我该怎么办?因为它是正确的节点下的正确节点,即右右类型,因此目前我们需要提起2个。此操作称为L旋转。

  同样,如果我们目前插入7、6和5,则将打开正确的旋转操作,并将增加6个。

  因此,为了保持平衡,AVL树在插入和更新数据时执行一系列计算和调整操作。

  我们已经解决了平衡问题,因此如何将数据查询为索引作为索引?在平衡的二进制树中,节点,其大小为固定单元。应该将什么存储为索引?

  第一个:索引的钥匙值。例如,我们在ID上创建了一个索引,当我查询条件where id = 1时,我会在索引中找到ID的键值。

  第二个:数据磁盘地址,因为索引的作用是找到数据存储的地址。

  第三是因为它是二进制树,它必须对左节点和右节点有一个引用,以便我们可以找到下一个节点。下一棵树的节点,并继续判断。

  如果您存储这样的数据,让我们看一下会有什么问题。

  首先,索引数据放在硬盘上。查看数据和索引的大小:

  当我们使用树的结构存储索引时,因为我们获得了一个数据,我们必须比较服务器层所需的数据。如果没有,我们必须再次读取磁盘。当访问节点时,使用磁盘发生IO。InnoDB操作磁盘的最小单元是一个页面(或一个磁盘块),大小为16K(16384字节)。

  然后,一棵树的节点的大小为16k。如果我们在节点中只有一个键值+数据+参考,例如整形手术场可能只使用十二个字节或数十个字节,则远小于16K。当IO时,我浪费了很多空间。

  因此,如果每个节点中存储的数据太小,并且从索引中找到我们需要的数据,则需要访问更多的节点,这意味着与磁盘的相互作用太多。

  如果是机械硬盘的时代,则来自每个磁盘的数据读取数据约为10ms。交互的数量越多,时间消耗就越多。

  例如,在上图中,我们在一个表中有6个数据。当我们查询ID = 37时,您需要查询两个子节点,我们需要与磁盘进行3次交互。如果我们有数百万个数据怎么办?这次更难估计。

  那么我们的解决方案是什么?

  首先是允许每个节点存储更多数据。

  其次,节点上的关键字数量越多,指针中的指针数就越多,这意味着可以有更多的叉子。

  因为越多的位,树的深度将减小(根节点为0)。这样,我们的树是否从原始的高,薄和薄,变成脂肪和脂肪?

  目前,我们的树不再是两个fork,而是多fork或多路。

  像AVL树一样,B树在分支节点和叶子节点上存储关键值,数据地址和节点引用。

  它具有一个特征:拆分(路)的数量总是比关键字的数量多1个。例如,我们绘制的树和每个节点存储两个关键字,然后将有三个指向三个子节点的指针。

  什么是B树的搜索规则?

  例如,我们想在此表中找到15个。因为15个小于17,左路步行。由于15个大于12,在右侧步行。15在磁盘块7中发现,只有3次。

  这比AVL树更有效吗?那么B树如何实现存储多个关键字的节点,并且仍然保持平衡?AVL树有什么区别?

  例如,当最大学位为3时,我们插入数据1、2和3,当插入3时,它应该是第一个磁盘块,但是如果一个节点具有三个关键字,则意味着有任何指示器,子节点将转4,因此必须将它们分开(实际上是b+树)。将中间数据2和1和3转入2的子节点。

  如果删除了节点,将会有相反的合并操作。

  请注意,这是分裂和合并,它与AVL树的左右旋转不同。

  我们继续插入4和5,B树将进行分裂和合并操作。

  从中,我们可以看到更新索引时会进行大量索引结构调整,因此它解释了为什么我们不在经常更新的列上构建索引,或者为什么不更新主键。

  节点的划分和合并实际上是InnoDB页面(页面)的分区和合并。

  B树的效率已经很高。为什么MySQL仍然改善B树并最终使用B+树?

  总体而言,该B树的改进版本比B树更全面。

  让我们看一下InnoDB中B+树的存储结构:

  MySQL中的B+树具有多个特征:

  B+树的数据搜索过程:

  Innodb中B+树的功能:

  看到这一点,我相信我的朋友应该知道为什么MySQL选择使用B+树作为索引数据结构模型。

  在下一篇文章中,我们将继续讨论索引,创建和使用的规则。如果文章对您有所帮助,请记住赞美,关注和收集。