MySQL索引底层实现

一、引入

索引的概念:索引是可以快速获取数据的数据结构。

那么既然是数据结构,用什么数据结构实现呢?

首先对于下面的表
在这里插入图片描述
如果执行语句 select * from t where t.money = 300;,需会全表扫描,一条一条的遍历查询。

查询一行数据至少和磁盘做一次I/O操作(I/O是很耗性能的),至少要做 7 次 I/O 操作。

二、索引的数据结构

1)AVL树

那么利用AVL树的特性,将数据划分为两部分,可以降低时间复杂度。
在这里插入图片描述
图示是最好的情况,近似于折半查找,时间复杂度为O(log2n)。

复杂度分析
假设要查找节点t,从BST树的根节点开始,不断进行比较。通过BST数,理想情况下需要查找的节点数减半。假设有n个元素,每次折半查找的元素数为n/2,n/4,...,n/2^k,由于n/2^k >= 1,令n/2^k = 1,k = log2n,所以时间复杂度为O(log2n)。

但对于特殊数据,组成不平衡的AVL树,退化为顺序查找,效率为O(n)。
在这里插入图片描述

2)红黑树

在这里插入图片描述
当单边的节点大于3时候,红黑树就会自动调整(左旋/右旋),这样可以解决二叉树的弊端。

红黑树特点:

1.节点是红色或黑色。

2.根节点是黑色。

3.每个叶子节点(NIL节点)都是黑色的空节点。

4 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)

5.从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

性质4和性质5作为约束,即可保证任意节点到其每个叶子节点路径最长不会超过最短路径的2倍。

但是红黑树同样也有弊端:

  • 当数据量特别大的时候,红黑树的高度特别大。
  • 有可能查询的数据在叶子节点,那查询的次数也很大,且进行多次磁盘I/O操作,性能差。
3) B树

在这里插入图片描述多路平衡查找树,M阶B树代表每个节点最多可以有M个子节点,所有非叶子节点在同一层。

B树有以下特点:

  • 每个节点中的关键字都按照从小到大的顺序排列,每个关键字的左子树中的所有关键字都小于它,而右子树中的所有关键字都大于它。
  • 所有叶子节点都位于同一层,并且叶子节点只有关键字,指向孩子的指针都为null。
  • 每个节点都存有索引和数据,也就是对应的key和value。

B树查找数据的时间复杂度最好为O(1),即在第一个节点就查到,最差为O(logN)。

B树的弊端:
若一个节点的空间为16KB,若data中的数据过大,则一个节点能放的数据量越小,这样就会造成树的高度比较大(比红黑树高度小点)

4) B+树

在这里插入图片描述
B+ Tree 是基于 B Tree 和叶子节点顺序访问指针进行实现,它具有 B Tree 的平衡性,并且通过顺序访问指针来提高区间查询的性能。

B+树与B树的区别:

  • B+树的非叶子节点只存储索引,不存储data,可以放更多索引

  • 叶子节点包含所有索引字段,所有的data元素都存储在叶子节点

  • 叶子节点使用指针连接,对 select * from t where col2 > 20 的范围查找更快速
    在这里插入图片描述

  • 时间复杂度固定为O(logN)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值