B+索引与数据库
context
这一个月忙到爆炸,研究生课程很难,有好多课的作业即使花了很多时间也和别人有很大差距。
peer pressure。感觉别人都是信手拈来,数学算式这么那么就出来我,我就什么都不会。
国内秋招也在我忙作业的过程中要结束了。面试在九月上旬就停了,感觉我的这个项目有点坑,开始上课就要准备毕业找工作,
而且是要在学比较有挑战的课程之间找工作。我太难了。
像西西弗。
问题引入
- 某个sql查询比较慢,为条件字段加索引
- 使用B+数做索引,查询时间log(n)。 hash存索引,查询时间log(1).
- 为什么用B+
content
- 二插排序树,左子树比根小,右子树比根大
- 如果顺序插入,就不平衡了,变成了一边的链表
- 所以要一直保持平衡–>红黑树(TreeSet),保持最小的树高度,提高查找速率
想有排序操作的话,比方说每次进一个值都要排序,就用TreeSet
B树做文件索引比较多,想一下文件列表的层次结构,每个文件夹都有不一定数量的文件,
文件索引是存在硬盘上的,由于内存大小的原因可能不能一次性加载进来。
使用B树,每次加载一个节点的数据到内存中。当然每个节点的数据量也不能多,如果都在一个节点,可能还是加载不进来,退化成数组了。
hashset就是数组存。B+数是在B树的基础上改进的,每个数据都在叶子节点上,如图是4路B+树。这里的4路是指有4个子节点。红黑树是2路。
- 数据库中按id查找,可能是查找按id排序的前10名,如果要是用B树,可能就要在一个局部的几个节点中做中序遍历。
如果用B+树的话,所有数据都是在叶子节点,而且每个叶子节点之间有链表的结构。这样顺序遍历某一块就好了。 - 我觉得B+树结合了链表结构的查找和数组结构的遍历的优点
到这我又想到了跳表,我觉得跳表是在顺序数组的基础上结合和树结构的优势,而B+树是在树结构的基础上结合了顺序存储的优势。
不同的数据库使用不同的结构存储索引