CSDN|别再一知半解啦,索引其实就这么回事!( 五 )


B+Tree 在作为索引结构时能够带来的好处有:
一 , I/O 次数更少 。 这是因为上文也说过 , BTree 的节点是存放在内存页中的 。 那么在相同的内存页大小(一般为4k)的情况下 , B+Tree 能够存储更多的键值 , 那么整体树结构的高度就会更小 , 需要的 I/O 次数也就越小 。
二 , 数据遍历更为方便 。 这个优势很明显是由有序链表带来的 。 通过叶子节点的链接 , 使得对所有数据的遍历只需要在线性的链表上完成 , 这就非常适合区间检索和范围查询 。
三 , 查询性能更稳定 。 这自然是由于只在叶子节点存储数据 , 所以所有数据的查询都会到达叶子节点 , 同时叶子节点的高度都相同 , 因此理论上来说所有数据的查询速度都是一致的 。
正是由于 B+Tree 优秀的结构特性 , 使得常用作索引的实现结构 。 在 MySQL 中 , 存储引擎 MyISAM 和 InnoDB 都分别以 B+Tree 实现了响应的索引设计 。
物理存储
虽说 B+Tree 结构都可以用在 MyISAM 和 InnoDB , 但是这二者对索引的在物理存储层次的实现方式却不相同 。 InnoDB 实现的是聚簇索引 , 而 MyISAM 实现的却是非聚簇索引 。 在介绍聚簇索引之前 , 我们需要先了解以下啥是佩奇 , 不对 , 是啥是「主键索引」和「辅助索引」 。
其实概念很简单 。 我们刚刚不是在讲 B+Tree 的时候说过 , 树的非叶子节点只存储键值 。 没错就是这个键值 , 当这个键值是数据表的主键时 , 那么所建立的就是主键索引;当这个键值是其它字段的时候 , 就是辅助索引 。 因而可以得出 , 主键索引只能有一个 , 而辅助索引却可以有很多个 。
聚簇索引和非聚簇索引的区别也就是根据其对应的主键索引和辅助索引的不同特点而实现的 。
聚簇索引说回聚簇索引 。 先丢个定义 。
聚簇索引的主键索引的叶子结点存储的是键值对应的数据本身;辅助索引的叶子结点存储的是键值对应的数据的主键键值 。
这句话的信息量挺大的 。 首先 , 分析第一句话 , 主键索引的叶子节点存储的是键值对应的数据本身 。
我们知道 , 主键索引存储的键值就是主键 。 那么也就是说 , 聚簇索引的主键索引 , 在叶子节点中存储的是主键和主键对应的数据 。 数据和主键索引是存储在一起的 , 一起作为叶子节点的一部分 。
然后 , 分析第二句话 , 辅助索引的叶子结点存储的是键值对应的数据的主键键值 。
我们又知道 , 辅助索引存储的键值是非主键的字段 。 那就也就是说 , 通过辅助索引 , 可以找到非主键字段对应的数据行中的主键 。
重点来了 。 当然主键索引和辅助索引一结合 , 能干啥呢 。 当直接采用主键进行检索时 , 可通过主键索引直接获得数据;而当采用非主键进行检索时 , 先需要通过辅助索引来获得主键 , 然后再通过这个主键在主键索引中找到对应的数据行 。
举个例子吧 。 假设有这么一个数据表 。


CSDN|别再一知半解啦,索引其实就这么回事!
本文插图
那么采用聚簇索引的存储方式 , 对应的主键索引为:(主键为ID)
CSDN|别再一知半解啦,索引其实就这么回事!
本文插图
对应的辅助索引为:(键值为Name , 大概的意思):
CSDN|别再一知半解啦,索引其实就这么回事!
本文插图
所以当使用where ID = 7这样的条件查找主键 , 则按照B+树的检索算法即可查找到对应的叶节点 , 之后获得行数据 。 对Name列进行条件搜索 , 则需要两个步骤:第一步在辅助索引B+树中检索Name , 到达其叶子节点获取对应的主键 。 第二步使用主键在主键索引B+树种再执行一次B+树检索操作 , 最终到达叶子节点即可获取整行数据 。


推荐阅读