mysql基础-索引-数据结构(二叉树,红黑树,B-Tree,B+Tree)

1.索引的定义

MySQL官方对索引的定义为:索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护者满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。

2.索引数据结构

数据结构演示网站
对于理解数据结构很有帮助可以去玩一玩,常见的数据结构都有。
在这里插入图片描述

1.二叉树

二叉树对比无索引的数据结构。无索引只能采取全表扫描,显然二叉树的查找效率比全表扫描要高。
在这里插入图片描述
左边是数据表,一共有两列七条记录,最左边的是数据记录的物理地址(注意逻辑上相邻的记录在磁盘上也并不是 一定物理相邻的)。为了加快Col2的查找,可以维护一个右边所示的二叉查找树,每个节点分别包含索引键值和一个指向对应数据记录物理地址的指针,这样就可以运用二叉查找快速获取到相应数据。
一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在磁盘上。索引是数据库中用来提高性能的最常用的工具。

二叉树退化

当插入顺序正好是从小到大,二叉树就会退化成链表
在这里插入图片描述

2.红黑树

红黑树是一种近似平衡的二叉查找树,它能够确保任何一个节点的左右子树的高度差不会超过二者中较低那个的一陪。具体来说,红黑树是满足如下条件的二叉查找树(binary search tree):

  1. 每个节点要么是红色,要么是黑色。
  2. 根节点必须是黑色
  3. 红色节点不能连续(也即是,红色节点的孩子和父亲都不能是红色)。
  4. 对于每个节点,从该点至null(树尾端)的任何路径,都含有相同个数的黑色节点。

在树的结构发生改变时(插入或者删除操作),往往会破坏上述条件3或条件4,需要通过调整使得查找树重新满足红黑树的条件。
具体算法和实现参考博文

我们用红黑树来演示下刚刚二叉树里的数据
在这里插入图片描述
红黑树对比二叉树的优点:在于高度比二叉树矮,上面的数据最多查找三次可以完成。
对比二叉树缺点也很明显:插入数据的过程中会通过旋转来使得查找树重新满足红黑树的条件。需要比二叉树更复杂的算法来维持树结构。

想象一下我们常见的表一般数据量都会到10W+级别的数据甚至百万千万级别。那么红黑树的高度会达到几十层,那么我们查找一条数据就可能要经历几十次的查找。那效率可想而知。从这里我们可以看出查找次数和树的高度密切相关。二叉树和红黑树都不能满足需求。既然二叉树和红黑树太高了,那我们往胖了弄。

3.B-Tree

B树的特点:

  1. 所有键值分布在整个树中
  2. 任何关键字出现且只出现在一个节点中
  3. 搜索有可能在非叶子节点结束
  4. 在关键字全集内做一次查找,性能逼近二分查找算法
  5. 所有叶子节点都出现在同一层,且叶子节点不包含任何关键字信息(可以看做是外部接点或查询失败的接点,实际上这些结点不存在,指向这些结点的指针都为null)
  6. 每个非叶子节点包含有n个关键字信息(n,P0,K1,P1,K2,P2,…,Kn,Pn),其中:
    a) Ki (i=1…n)为关键字,且关键字按顺序升序排序K(i-1)< Ki。
    b) Pi为指向子树根的接点,且指针P(i-1)指向子树种所有结点的关键字均小于Ki,但都大于K(i-1)。
    c) 关键字的个数n必须满足: [ceil(m / 2)-1]<= n <= m-1。

在这里插入图片描述
来模拟下查找文件29的过程:
(1) 根据根结点指针找到文件目录的根磁盘块1,将其中的信息导入内存。【磁盘IO操作1次】
(2) 此时内存中有两个文件名17,35和三个存储其他磁盘页面地址的数据。根据算法我们发现17<29<35,因此我们找到指针p2。
(3) 根据p2指针,我们定位到磁盘块3,并将其中的信息导入内存。【磁盘IO操作2次】
(4) 此时内存中有两个文件名26,30和三个存储其他磁盘页面地址的数据。根据算法我们发现26<29<30,因此我们找到指针p2。
(5) 根据p2指针,我们定位到磁盘块8,并将其中的信息导入内存。【磁盘IO操作3次】
(6) 此时内存中有两个文件名28,29。根据算法我们查找到文件29,并定位了该文件内存的磁盘地址。

从B-Tree的结构看整个树变胖了。数据量大于红黑树的情况下用同样用三次查找可以完成所有数据的查询。而且数据量越大。B-Tree的优势越明显。但是mysql仍然没有选择B-Tree作为索引的结构。原因我们先看B+Tree

4.B+Tree

1.B+树的定义

B+树和二叉树、平衡二叉树一样,都是经典的数据结构。B+树由 B 树和索
引顺序访问方法演化而来,但是在现实使用过程中几乎已经没有使用 B 树的情况 了。
B+树的定义在很多数据结构书中都能找到,非常复杂,我们概略它的定义:
B+树是 B 树的一种变形形式,B+树上的叶子结点存储关键字以及相应记录 的地址,叶子结点以上各层作为索引使用。一棵 m 阶的 B+树定义如下:

  • 每个节点最多可以有 m 个元素;
  • 除了根节点外,每个节点最少有 (m/2) 个元素;
  • 如果根节点不是叶节点,那么它最少有 2 个孩子节点;
  • 所有的叶子节点都在同一层;
  • 一个有 k 个孩子节点的非叶子节点有 (k-1) 个元素,按升序排列;
  • 某个元素的左子树中的元素都比它小,右子树的元素都大于或等于它;
  • 非叶子节点只存放关键字和指向下一个孩子节点的索引,记录只存放在叶子节点中;
  • 相邻的叶子节点之间用指针相连。
    B+树的变体为 B树,在 B+树的非根和非叶子结点再增加指向兄弟的指针; B树定义了非叶子结点关键字个数至少为(2/3)*M,即块的最低使用率为 2/3(代 替 B+树的 1/2)。
    我们概要的了解下B+树。

B+树是为磁盘或其他直接存取辅助设备设计的一种平衡查找树。在 B+树中, 所有记录节点都是按键值的大小顺序存放在同一层的叶子节点上,由各叶子节点指针进行连接。

在这里插入图片描述
从上图我们可以归纳出 B+树的几个特征,在 B+树的简要定义中其实已经包 括了:

  1. 相同节点数量的情况下,B+树高度远低于平衡二叉树;
  2. 非叶子节点只保存索引信息和下一层节点的指针信息,不保存实际数据 记录;
  3. 每个叶子页(LeafPage)存储了实际的数据,比如上图中每个叶子页就 存放了 4 条数据记录,当然可以更多,叶子节点由小到大(有序)串联在一起, 叶子页中的数据也是排好序的;
  4. 索引节点指示该节点的左子树比这个索引值小,而右子树大于等于这个 索引值。
    注意:叶子节点中的数据在物理存储上完全可以是无序的,仅仅是在逻辑 上有序(通过指针串在一起)。

B+Tree对比B-Tree的优点在于:B+Tree非叶子节点不存储数据。使得每页存储的索引数据量比B-Tree更大。更重要的原因是叶子节点中存在指针,非常适合范围查找。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值