红黑树
B-Tree
这三个通常都是把内存全部加载到内存里,然后再内存中进行处理的,数据量通常不会很大。
内存一般容量都在GB级别,比如说现在常见的4G、8G或者16G。
如果要处理的数据规模非常大,大到内存根本存不下的时候。这个时候只能先存到硬盘里,硬盘呢
容量又比内存大的多,因为没有办法把大规模的数据读到内存里,所以只能分批次的把需要处理的
数据从硬盘调到内存里,进行进一步处理。
操作数据是需要CPU去执行相关的指令的,cpu是不能直接和硬盘进行交互的。硬盘里的数据必需
先调到内存里头,才能进一步和CPU进行交互,进行数据处理。可以叫做一次硬盘I/O,然而这个
访问速度是非常慢的,内存单次的访问时间是纳秒级别,但是硬盘的访问的毫秒级的,1毫秒等于
100万纳秒。
降低树高就可以减少非常耗时的硬盘操作。
B+Tree
节点之间是用指针连接成了一个链表的结构
B+Tree常被用作数据库中的索引结构,那实际上每个元素都包含指向对应记录存储地址的指针。那此时呢,结点内的元素又被称为关键字(key),通过关键字中包含的指针可以索引到数据库中的某一条记录。
B+Tree相当于数据表中的一个索引,可以通过关键字,快速定位到数据表中的某一条记录,实际
上关键字的指针指向的是数据文件中这一条(id=23)这一条的地址,其他关键字也是一样的都在最
下面画的那一排下面记录呢。B+Tree本身也是作为一个索引文件存储在硬盘里的,但在实际应用
中不一定非要以ID作为关键字,也可以将姓名作为关键字等(可以给同一个数据表构建多个不同关
键字的索引来应对各种各样的查询需求)。
因为叶子节点包含了所有的关键字,所以要顺序查找所有的关键字的记录,就像遍历链表一样,
非常的方便。如果要随机查找某一关键字,也需要挨个遍历去寻找呢?那么B+Tree的叶子节点不
就是解决这个问题吗?可以帮助我们快速定位到叶子节点某一关键字,相当于给叶子节点建立的索
引,目的就是实现以log级别的复杂度,去查找叶子节点上的某一关键字记录。
所以整个B+Tree是一套多级索引结构,目的就是为了加速查询的速度。我们只需要通过指向根节
点的指针,就可以以log级别的复杂度查找到指定关键字对应的记录。