前景
列出的数据结构:数组,链表,哈希,红黑树,B树(B+tree,B-tree)
mysql(InnoDB引擎)中索引所使用的数据结构。
1.排除数组,链表。
数组,链表不支持大量的数据存储,并且消耗内存。性能低。
2.排除哈希
hash函数只会计算出一个hash值。但是当user_id变化了,所产生的hash值也就变化了,就找不到具体数据记录。
而且不能支持联合索引中的部分索引查找。也不支持范围查找。
3.排除红黑树
原因:
1)数据量大时,读取磁盘的次数过多。
2)读取一次浪费太多。(一次才读取4byte,但是磁盘每次i/O操作需消耗16k)
但是红黑树用于hashMap正好,因为hashMap是内存操作,读取速度很快。
针对于上述问题。使用新结构B+tree
1)n叉树解决了数据量大时读取磁盘的次过多问题。
2)一个节点存储多个数据。
B+tree结构正好满足要求,1.n叉树,2.一个节点存储过个数据。
B+tree
特点
B+Tree和B-Tree的不同点
- 非叶子节点只存储键值信息。
- 所有叶子节点之间都有一个链指针。
- 数据记录都存放在叶子节点中。
B+Tree是在B-Tree基础上的一种优化,使其更适合实现外存储索引结构,InnoDB存储引擎就是用B+Tree实现其索引结构。
B+Tree结构
在B+Tree中,所有数据记录节点都是按照键值大小顺序存放在同一层的叶子节点上,而非叶子节点上只存储key值信息,这样可以大大加大每个节点存储的key值数量,降低B+Tree的高度。
当不满足B+Tree结构时,会进行分裂。
例:5阶的B+Tree组成:5个指针(5条线) 4个关键字(4个存储空间)
参考博客:https://blog.csdn.net/hao65103940/article/details/89032538
B-Tree
B-Tree是为磁盘等外存储设备设计的一种平衡查找树.
每个节点中不仅包含数据的key值,还有data值。而每一个页的存储空间是有限的,如果data数据较大时将会导致每个节点(即一个页)能存储的key的数量很小,当存储的数据量很大时同样会导致B-Tree的深度较大,增大查询时的磁盘I/O次数,进而影响查询效率。所以就出现了B+Tree(对B-Tree的一种优化)。