索引介绍
索引是一种用于快速查询和检索数据的数据结构,其本质可以看成一种排序好的数据结构。
索引底层数据结构存在很多类型,常见的索引结构有:B数、B+数和Hash、红黑树。在MySql中,无论是Innodb还是MyIsam都是用了B+树作为索引结构。
索引的优缺点
优点:
- 使用索引可以大大加快数据的检索速度(大大减少检索的数据量),减少IO次数,这也是创建索引的最主要的原因
- 通过创建唯一性索引,可以保证数据库表中数据的唯一性。
缺点:
- 创建索引和维护索引需要耗费许多时间。对当前表中的数据进行增删查改的时候,如果数据也有索引,那么索引也需要动态的修改,会降低SQL的执行效率。
- 索引需要使用物理文件存储,也会耗费一定的空间。
索引底层的数据结构
1、B 树(B-Tree)
B 树是一种平衡的多路查找树。
- 结构特点:
- 每个节点包含多个关键字和指向子节点的指针。
- 所有叶子节点在同一层,保证了树的平衡。
- 关键字数量满足一定的范围,通常是在一个节点中存储多个关键字,使得树的高度相对较低。
- 优势:
- 适合磁盘存储,因为磁盘的读写操作是以块为单位的,B 树的节点可以充分利用磁盘块的空间,减少磁盘 I/O 次数。
- 平衡的结构保证了查找、插入和删除操作的时间复杂度相对稳定,为 O (log n),其中 n 是树中节点的数量。
2、B + 树(B+Tree)
B + 树是在 B 树基础上进行改进的一种数据结构。
- 结构特点:
- 非叶子节点只存储关键字和指向子节点的指针,不存储实际的数据记录。
- 叶子节点包含所有的关键字和对应的数据记录,并且叶子节点之间通过指针形成链表。
- 优势:
- 非叶子节点不存储数据记录,因此可以存储更多的关键字和指针,使得树的高度更低,进一步减少磁盘 I/O 次数。
- 叶子节点形成的链表便于进行范围查询和顺序遍历。
3、红黑树
红黑树是一种自平衡二叉查找树,通过在插入和删除节点时进行颜色变换和旋转操作,使得树始终保持平衡状态;
-
结构特点:
- 每个节点非红即黑;
- 根节点总是黑色的;
- 每个叶子节点都是黑色的空节点(NIL 节点);
- 如果节点是红色的,则它的子节点必须是黑色的(反之不一定);
- 从任意节点到它的叶子节点或空子节点的每条路径,必须包含相同数目的黑色节点(即相同的黑色高度)。
-
优势:
- 高效的查找性能: 作为一种二叉搜索树,红黑树保持了左子树节点值小于根节点值,右子树节点值大于根节点值的特性。这使得查找操作可以再O(log n)的时间复杂度内完成,其中n是树中节点的数量。
- 自平衡性: 红黑树在插入和删除节点时,会通过旋转和重新着色等操作来保持树的平衡。这使得红黑树在动态变化的情况下仍然能够保持较好的性能,避免了普通二叉搜索树可能出现的极端不平衡的情况。
-
操作:
- 插入操作: 插入新节点时,新节点通常被标记为红色。然后,根据红黑树的规则进行调整,可能需要进行旋转和重新着色操作,以确保红黑树的性质得到满足。
- 删除操作: 删除节点时,首先找到要删除的节点,然后进行删除操作。删除后可能会破坏红黑树的性质,需要进行调整,同样可能涉及旋转和重新着色操作。
4、哈希索引
- 结构特点:
- 通过哈希函数将关键字映射到一个固定的位置,这个位置存储着对应的数据记录或者指向数据记录的指针。
- 优势:
- 查找速度非常快,时间复杂度为 O (1),只要计算出哈希值,就可以直接定位到数据所在的位置。
- 局限性:
- 不适合范围查询和排序操作,因为哈希函数的结果是随机的,无法保证数据的有序性。
- 当存在哈希冲突时,需要进行额外的处理,可能会影响性能。
B 树& B+树两者有何异同呢?
- B 树的所有节点既存放键(key) 也存放数据(data),而 B+树只有叶子节点存放 key 和 data,其他内节点只存放 key。
- B 树的叶子节点都是独立的;B+树的叶子节点有一条引用链指向与它相邻的叶子节点。
- B 树的检索的过程相当于对范围内的每个节点的关键字做二分查找,可能还没有到达叶子节点,检索就结束了。而 B+树的检索效率就很稳定了,任何查找都是从根节点到叶子节点的过程,叶子节点的顺序检索很明显。
- 在 B 树中进行范围查询时,首先找到要查找的下限,然后对 B 树进行中序遍历,直到找到查找的上限;而 B+树的范围查询,只需要对链表进行遍历即可。
- 综上,B+树与 B 树相比,具备更少的 IO 次数、更稳定的查询效率和更适于范围查询这些优势。
红黑树与 B + 树的区别?
- 结构特点:
- 红黑树是二叉搜索树,每个节点最多有两个子节点。
- B + 树是一种多路平衡查找树,每个节点可以有多个子节点。
- 高度和节点数量:
- 红黑树的高度相对较高,随着节点数量的增加,树的高度也会增加。
- B + 树的高度相对较低,由于每个节点可以有多个子节点,能够存储更多的关键字,从而减少树的高度。
- 叶子节点:
- 红黑树的叶子节点没有特殊的连接关系。
- B + 树的叶子节点通过指针连接成一个有序链表,便于进行范围查询和顺序遍历。
- 存储方式:
- 红黑树通常用于内存中的数据结构,节点的存储和操作相对简单。
- B + 树更适合用于磁盘存储,节点可以充分利用磁盘块的空间,减少磁盘 I/O 次数。