1.根据某个值查找数据
2.根据区间值来查找某些数据
非功能性考虑因素:
1.执行效率
2.存储空间

假设可能的实现方式:

跳表

跳表是在链表之上加上多层索引构成的。它支持快速地插入、查找、删除数据,对应的时间复杂度是 O(logn)。

vbs 获取mysql索引 mysql怎么实现索引_vbs 获取mysql索引


改造的二叉查找树

树中的节点并不存储数据本身,而是只是作为索引。把每个叶子节点串在一条链表上,链表中的数据是从小到大有序的。

vbs 获取mysql索引 mysql怎么实现索引_vbs 获取mysql索引_02


改造的二叉查找树可以实现所需的功能,但是在性能上不能满足要求:

1.将索引放在内存:对于大数据占用太大无法实际应用。

2.将索引存在磁盘中,读取时IO占用时间资源太大。

构建m叉树

可以降低树的高度,进而减少IO读取次数。

考虑m的大小:

由于不管是内存中的数据,还是磁盘中的数据,操作系统都是按页(一页大小通常是 4KB,来读取的,一次会读一页的数据。如果要读取的数据量超过一页的大小,就会触发多次 IO 操作。在选择 m 大小的时候,要尽量让每个节点的大小等于一个页的大小。读取一个节点,只需要一次磁盘 IO 操作。

B+ 树的特点:

1.每个节点中子节点的个数不能超过 m,也不能小于 m/2;

2.根节点的子节点个数可以不超过 m/2,这是一个例外;

3.m 叉树只存储索引,并不真正存储数据,这个有点儿类似跳表;

4.通过链表将叶子节点串联在一起,这样可以方便按区间查找;

5.一般情况,根节点会被存储在内存中,其他节点存储在磁盘中。

B 树跟 B+ 树的不同点
1.B+ 树中的节点不存储数据,只是索引,而 B 树中的节点存储数据。
2.B 树中的叶子节点并不需要链表来串联。