MySQL中的索引原理分析(二)

225 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第5天,点击查看活动详情

本系列上一部分中,对MySQL的索引的基本概念、作用,以及索引的类型,进行了简要介绍。本部分将着重介绍MySQL索引底层的数据结构的实现细节。

这里需要先介绍几个概念。

首先是B+树。在介绍B+树之前需要先介绍一下B树。B树是balance tree的简称,中文名叫做多路平衡查找树。之所以称作“平衡”指的是因为在有新节点插入时,会进行一定的调整策略,从而保证树的高度不会急剧增加,而多路的意思是指每个节点有多个孩子节点。B树的每个节点里面存放的内容包括关键字(key)、真正的数据以及指向孩子节点的指针。其中指针可以理解为关键字的区间分隔线,假如一个节点有2个关键字40和60,那么第一个指针P1指向的孩子节点存放的关键字都是小于40的,第二个指针P2指向的孩子节点存放的关键字都是在40到60之间的,第三个指针P3指向的孩子节点存放的关键字都是大于60的。在存放数据方面,B树并不区分是否是叶子节点。所有的叶子结点都在同一高度上。在基于关键字执行搜索时,会将当前关键字与检索关键字进行比较,并根据比较结果决定走到下一层的哪一个孩子节点继续进行检索。B+树不同于B树的地方在于,它的非叶子结点只存索引、不存实际数据、叶子节点负责存数据或者指向数据的指针。这样做的好处很明显,那就是可以使得同样容量的叶子节点内,可以存储更多的索引,这样可以使得树的高度更小、查询层数更少。为什么我们这么关心查询层数呢?因为其实作为MySQL数据库索引的底层重要数据结构,B+树是存储在磁盘上的。我认为主要是因为单位存储容量下磁盘比内存更便宜,所以选择把大量数据存放在磁盘上。