什么是索引
- 索引可以想象成一本书的目录
- 我们为了能够快速定位到某一篇文章 可以通过查看目录, 定位到该文章所在的页数, 从而从一本厚厚的书中精准的找到某一页
索引的内部数据结构(重点)
- 索引的内部结构依托于B+树
- 谈到B+树我们要先看看B树是什么
-B树
B树是一种N叉搜索树
形如下图
(画的不好看 见谅哈~~)
-
B树的根节点中不只有一个数据, 而是可以存放多个数据, 这多个数据被分为多段数据范围
-
好比上图的根节点 50 100 200
-
被分为 x < 50 , 50 < x < 100 , 100 < x < 200, x > 200
这四个范围 -
这四个范围衍生出四个子节点
-
而每个子节点中也可以有多个数据, 这多个数据又被分为多个范围, 多个范围又衍生出多个子节点
这就是B树
B+树
B+树就是在B树的基础上做了些优化
即 形如下图
B+树和B树的区别
- 父节点里面的值会作为子节点中最大的值(也可以是最小的值)出现, 这样做所有的叶子结点就包含了整棵树数据的全集
- 如果把所有叶子结点用链表连接起来, 这样查找会比原来更高效
- 每一行数据库中的其他信息, 仅仅存放在叶子结点上(就是上图用红圈圈起来的数字), 非叶子结点仅包含索引列数据, 这样非叶子结点所占的空间就小了 就可以放到内存中随时读取, 比从磁盘上要方便得多.
和其他的数据结构相比为什么B+树更适合数据库呢?
用于查找数据的数据结构有很多 比如 线性表, 二叉搜索树, 哈希表, 那为什么我们要使用B+树来存放数据库的索引呢?
- 首先线性表效率太低, 不考虑
- 二叉搜索树的效率是和树的高度密切相关的, 如果树过高的话效率比较低
- 哈希表只适合值确定的查找, 比如我想查找年龄=18的人, 但是不适合范围查找, 比如我想查找年龄在18~28之间的人, 哈希表就不太方便
- 所以B+树才是最好的选择