B+树
哈希索引
当我们查询数据的时候,单点数据查询效率最高的是哈希索引,时间复杂度O(1),但是当查询数据是一个范围的话,那么由于哈希表的数据组织结构是无序的,对于范围查询不友好,必须全表扫描。效率低下。
二分查找
为了克服这个缺点,需要有序的数据结构来实现范围查询,想到有序数组的二分查找,时间复杂度是O(logn),此时对于数组的增加、插入、删除等效率较低,时间复杂度O(n)。
二叉搜索树(BST)
那么又提出新的数据结构BST(二叉搜索树),查找,增加,删除,插入时间复杂度都在O(logn),但是极端情况下二叉搜索树会退化成单链表,查找效率O(n)。
高度平衡的二叉搜索树
此时保证二叉搜索树的左右子树高度平衡才行,所以采用高度平衡的二叉搜索树才能(如AVL,红黑树),但是当数据量巨大时,树的高度仍然很高(树高等价于访问磁盘I/O的次数),查询效率低。
多叉树(B树)
此时引入多叉树,降低树的高度,称B树。查找效率仍然是O(logn),但是范围查找时,需要中序回溯。效率不高。
B树升级版:B+树
在B树的结构上做调整,叶子节点采用双链表结构连接,避免的中序回溯。
B树和B+树的区别。
- B树每个节点都存放索引+数据,查找时间复杂度为O(1)~(Ologn),不稳定。B+树叶子节点存放数据,非叶子节点存放索引,查找固定时间复杂度O(logn)。稳定
- B+树中非叶子节点只存放索引,占用空间小,那么操作系统基于页式管理方式,一个页面对于的物理块大小固定,一个页中能存放的索引越多(可以理解为m叉树中m越大),那么树高就越小,I/O次数就少,性能就高。
- B树在范围查找的时候找下一个节点需要中序遍历回溯,性能较差。而B+树数据存放在叶子节点,查找下一个数据只需要遍历链表即可,性能较优。