为什么MySQL用B+树做索引

索引这个词,相信大多数人已经相当熟悉了,很多人都知道MySQL的索引主要以B+树为主,但是要问到为什么用B+树,恐怕很少有人能把前因后果讲述的很完整。本文就来从头到尾介绍下数据库的索引。

索引是一种数据结构,用于帮助我们在大量数据中快速定位到我们想要查找的数据。 索引最形象的比喻就是图书的目录了。注意这里的大量,数据量大了索引才显得有意义,如果我想要在[1,2,3,4]中找到4这个数据,直接对全数据检索也很快,没有必要费力气建索引再去查找。索引在mysql数据库中分三类: 

B+树索引、Hash索引、全文索引

我们今天要介绍的是工作开发中最常接触到innodb存储引擎中的的B+树索引。

要介绍B+树索引,就不得不提二叉查找树,平衡二叉树和B树这三种数据结构。B+树就是从他们仨演化来的。

二叉查找树

首先,让我们先看一张图

ba827c7f892c0f6ca5f6ad16fcb1ec7f.png

110944a8122c6c01c9a552f42baa8cf7.png

平衡二叉树

上面我们讲解了利用二叉查找树可以快速的找到数据。但是,如果上面的二叉查找树是这样的构造:

4a74ff043c811b192429dfe7e1e8ae31.png

fefd9611e2da416f79dbe745cb9ca1b9.png

下面是平衡二叉树和非平衡二叉树的对比:

959ec15de32304251cecd02e9a039e9e.png

由平衡二叉树的构造我们可以发现第一张图中的二叉树其实就是一棵平衡二叉树。

平衡二叉树保证了树的构造是平衡的,当我们插入或删除数据导致不满足平衡二叉树不平衡时,平衡二叉树会进行调整树上的节点来保持平衡。具体的调整方式这里就不介绍了。

平衡二叉树相比于二叉查找树来说,查找效率更稳定,总体的查找速度也更快。

B树

a66076523ac165492fe9e86b491872f5.png

a067eda4ed7d0377226e5a37ec85e798.png

为了解决平衡二叉树的这个弊端,我们应该寻找一种单个节点可以存储多个键值和数据的平衡树。也就是我们接下来要说的B树。 


B树(Balance Tree)即为平衡树的意思,下图即是一颗B树。

c9a2da6d7750e075315fb2c848985cbb.png

7209abf77c4ab8e152f1a7510f4a2d03.png

B+树

B+树是对B树的进一步优化。让我们先来看下B+树的结构图:

e1a6cd018123fb57ddc8cae713172f12.png

根据上图我们来看下B+树和B树有什么不同。 

3a7de3c2ef210d77c9c3a08d78286bf6.png

聚集索引 VS 非聚集索引

2cbc1a35a4aef1a5db9e37848939f8bf.png

利用聚集索引和非聚集索引查找数据

前面我们讲解B+树索引的时候并没有去说怎么在B+树中进行数据的查找,主要就是因为还没有引出聚集索引和非聚集索引的概念。下面我们通过讲解如何通过聚集索引以及非聚集索引查找数据表中数据的方式介绍一下B+树索引查找数据方法。

利用聚集索引查找数据
44f61454807f56eb699d5e2277fe10ee.png

还是这张B+树索引图,现在我们应该知道这就是聚集索引,表中的数据存储在其中。现在假设我们要查找id>=18并且id<40的用户数据。对应的sql语句为select * from user where id>=18 and id <40,其中id为主键。具体的查找过程如下:

8dca7fc1657c58ae26cc268e75886f91.png

1869673b53a9bc29f39dbbd09883a878.png

下面看下具体的查找流程图:

7f19a2095b33e69e2d287278da5b54f5.png

利用非聚集索引查找数据

4f36c04c62743d004eb94aa7322c7c70.png

c77f45eab4d523b75c352f6ed7340785.png

下面看下具体的查找流程图:

241b4b0c9b4af9cff90144e39820bb84.png

在MyISAM中,聚集索引和非聚集索引的叶子节点都会存储数据的文件地址。

总结

本篇文从二叉查找树,详细说明了为什么mysql用B+树作为数据的索引,以及在innodb中数据库如何通过B+树索引来存储数据以及查找数据。我们一定要记住这句话:数据即索引,索引即数据

若有收获,请记得三连发,分享点赞在看

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值