需求:
性能方面,MySQL数据持久化存储在磁盘,查询需要读到内存,因此查询时间与磁盘I/O次数有关
还需要支持范围查询
关于数据结构,一步一步来:
首先是数组,但是存在问题:
1.数组查询时间复杂度为O(n),查询效率不高
2.往数组中插入元素后续元素都要后移一位,性能较低
接着想到二分法 - 二叉搜索树,但是存在问题:
1.二叉搜索树查询的时间复杂度为O(logn),但是极端情况下树会变成一个单链表,查找的时间复杂度退化为O(n),这是二叉搜索树不平衡的问题
于是想到自平衡二叉树 - 平衡二叉搜索树 / 红黑树,但是存在问题:
1.随着数据的增多,树的高度增加,磁盘I/O次数增加,性能下降
想到增加树的阶数以降低树的高度,即将二叉树改为多叉树 - B树,但是存在问题:
1.B树的结点存储索引和记录,如果要查找的数据靠近叶子节点(离根节点很远),就会把其他节点的数据读到内存中,而这些节点中的记录是没用的,造成了浪费
因此想到B+树:
1.B+树的非叶子节点只存储索引,叶子节点存储索引和记录
2.B+树的叶子节点之间构成一个有序的双向链表,便于范围查询
3.B+树存在冗余节点,因此进行插入和删除操作树形结构变化很小
END