MySQL索引详解

本文详细介绍了数据库索引的底层数据结构,重点讲解了B树和B+树的区别及其优势,包括查找过程、优点以及为什么B+树在性能上更优。文章还探讨了索引类型、索引的优缺点以及使用原则,强调了B+树在存储引擎如InnoDB中的作用和聚簇索引的影响。
摘要由CSDN通过智能技术生成

索引数据结构

先聊一下索引的底层数据结构,着重介绍现在用的比较广泛的B树与B+树。

hash 表

hash表的数据结构在此就不多赘述了,直接说hash表的缺点:

  • 需要大量内存空间,因为每次使用hash表的时候都需要将全量的数据加载到内存中。(memory存储引擎使用hash索引)
  • 使用hash表时需要设计优秀的hash算法,否则会导致数据分布不均匀,浪费存储空间,查询效率低下。
  • hash表只能支持等值搜索,不能范围或区间搜索。比如要查询id < 500的人,hash表只能从1到499依次查出来。这是hash表比较致命的缺点。

二叉树

使用二叉搜索树可以使用二分查找方式查找数据,但是如果插入的数据是递增的,二叉树就会退化成链表,树的深度也很大,而树的深度与查找次数成正比(下面会解释)。因此单纯的二叉搜索树效率可能会低下。

那么使用二叉平衡树(AVL树)呢?
二叉平衡树要求左右子树高度差不大于1,这避免了上面数据退化成链表的情况,提高了搜索效率,但是在插入数据时,二叉平衡树为了保证平衡性,插入时要进行旋转,而这降低了插入效率。此外,在数据量大的情况下,二叉平衡树还是无法避免深度大的情况。

在这里插入图片描述

红黑树

为了解决二叉树插入效率低的情况,在看看红黑树,他也是二叉平衡树,但它只要求最长子树的深度不超过最短子树的二倍,而且还添加了变色的行为来保证树的平衡性。

在这里插入图片描述

可是这还是无法避免深度大的情况,接下来的思路大家应该也想到了,就是增加树的的分支来减少树的深度,这就是B树。

B树

B树最大的特点是每个节点可以包含多个Key值,B树中有一个叫degree概念,表示每个节点最多可以存储N-1个节点。

B树特点:

  1. 所有键值分布在整颗树中
  2. 搜索有可能在非叶子结点结束,在关键字全集内做一次查找,性能逼近二分查找
  3. 每个节点最多拥有m个子树
  4. 根节点至少有2个子树
  5. 分支节点至少拥有m/2颗子树(除根节点和叶子节点外都是分支节点)
  6. 所有叶子节点都在同一层、每个节点最多可以有m-1个key,并且以升序排列

下面看一个实例:

在这里插入图片描述
实例图说明:

每个节点占用一个磁盘块,一个节点上有两个升序排序的关键字和三个指向子树根节点的指针,指针存储的是子节点所在磁盘块的地址。两个关键词划分成的三个范围域对应三个指针指向的子树的数据的范围域。以根节点为例,关键字为 16 和 34,P1 指针指向的子树的数据范围为小于 16,P2 指针指向的子树的数据范围为 16~34,P3 指针指向的子树的数据范围为大于 34。

查找关键字过程:

  1. 根据根节点找到磁盘块 1,读入内存。【磁盘 I/O 操作第 1 次】

  2. 比较关键字 28 在区间(16,34),找到磁盘块 1 的指针 P2。

  3. 根据 P2 指针找到磁盘块 3,读入内存。【磁盘 I/O 操作第 2 次】

  4. 比较关键字 28 在区间(25,31),找到磁盘块 3 的指针 P2。

  5. 根据 P2 指针找到磁盘块 8,读入内存。【磁盘 I/O 操作第 3 次】

  6. 在磁盘块 8 中的关键字列表中找到关键字 28。

但是B树依旧有缺点:

  1. 每个节点都有key,同时也包含data,而每个页存储空间是有限的,如果data

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值