【数据结构与算法】->数据结构-> B+ 树->如何实现 MySQL 数据库索引

Ⅰ 前言

我们在使用数据库的时候,为了加速数据库中数据的查找速度,我们常用的处理思路是,对表中数据创建索引。那么,数据库索引是怎么实现的呢?它的底层使用的是什么数据结构和算法?这篇文章我们就来研究一下这个问题。

Ⅱ 算法解析

① 需求分析

首先,我们先思考一个问题,就是数据库要解决什么问题,有哪种需求。我们这里只思考两个最常用的需求:

  • 根据某个值查找数据,比如 SELECT * FROM user WHERE id = 123;
  • 根据区间值来查找某些数据,比如 SELECT * FROM user WHERE id > 100 AND id < 500;

除了这些功能性需求之外,这种问题往往还会涉及一些非功能需求,比如安全、性能、用户体验等等。我们着重来考虑性能方面的需求。性能方面的需求我们主要考察时间和空间两方面,也是老生常谈了,就是执行效率和存储空间。

在执行效率方面,我们希望通过索引,查询数据的效率尽可能的高;在存储空间方面,我们希望索引不要消耗太多的内存空间。

需求我们分析清楚了,我们现在想一下可以用来实现的数据结构。支持快速查询、插入等操作的动态数据结构,主要有散列表、平衡二叉查找树以及跳表。

我们先来看散列表 。散列表的查询性能很好,时间复杂度是 O(1)。但是,散列表不能按照区间快速查找数据。所以,散列表不能满足我们的需求。

我们再来平衡二叉查找树。尽管平衡二叉查找树查询的性能也很高,但是时间复杂度是 O(logn)。而且,对树进行中序遍历,我们还可以得到一个从小到大有序的数据序列,但这仍然不足支持按照区间快速查找数据。

最后我们来看跳表。跳表是在链表之上加上多层索引构成的。它支持快速地插入、查找、删除数据,对应的时间复杂度是 O(logn)。并且,跳表也支持按照区间快速地查找数据,我们只需要定位到区间起点值对应在链表中的结点,然后从这个结点开始,顺序遍历链表,直到区间终点对应的结点为止,这期间遍历得到的数据就是满足区间值的数据。

在这里插入图片描述

这样看来,跳表是可以解决这个问题。实际上,数据库索引所用到的数据结构跟跳表非常相似,叫作 B+ 树。不过,它是通过二叉查找树演化过来的,而非跳表。下面我们就来还原一下 B+ 树演化的过程。

② 二叉查找树的演化

如果你对二叉查找树还不清楚,可以跳转去看我下面的这篇文章。👇

【数据结构与算法】->数据结构->二叉查找树

为了让二叉查找树支持按照区间来查找数据,我们可以对它进行这样的改造:树中的节点并不存储数据本身,而是只是作为索引。除此之外,我们把每个叶子节点串在一条链表上,链表中的数据是从小到大有序的。经过改造之后的二叉树,就像下图,是不是就很像跳表了?

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值