树
思路:采用二分法和数据平衡策略来提升查找数据的速度;
二叉排序树
两个节点,左小右大
- 缺点:
有可能退化成列表,树的深度差距大。
平衡二叉树
树的深度 差距不超过1
- 缺点:
追求平衡苛刻,插入时出现不满足的情况,需要花时间去做一些变换。
红黑树
放弃了追求完全平衡,追求大致平衡。插入节点的变换会更少
- 缺点:
一个节点只能2路查找
B树
多路查找
- 缺点:
查询速度不稳定
B+树
只拿 叶子节点 保存指针数据,构成了一个有序链表,查询速度更高、更稳定
-
缺点:
容量有限,节点满时就会分裂。分裂后逻辑上连续的叶子节点在物理磁盘上往往不连续,甚至分离的很远,但做范围查询时,会产生大量读随机IO
写也一样:(7->1000->3->2000)数据存储在磁盘上相隔很远,随机io -
mysql
非叶子节点: 16KB,减去必要信息,剩下16252B
mysql单行指针数据大约13.5B,一个节点能存储1203条左右;超过了就要分裂出下一层的节点(多一次IO)
叶子节点:能存储15KB左右数据
3层B+树(3次IO),能存储2100W条数据
B*树
兄弟节点之间有指针。空间更合理。节点满时会向兄弟节点转移关键字
- 缺点
LSM树(日志结构合并树)
-
思路
牺牲了部分读性能,用来大幅提高写性能 -
方案
就是假定内存足够大,每次有数据更新先留在内存,
等到积累到最后多之后,再使用归并排序的方式将内存内的数据合并追加到磁盘队尾
- 在内存中构建一颗有序小树
- 内存小树越来越大,内存的小树会flush到磁盘上【磁盘内容有序】
- 读:不知道数据在哪棵小树上,因此必须遍历所有的小树
- 缺点
查询需要快速响应时性能不佳