B+ 树:
- 有 k 个子树的中间节点就有 k 个元素,每个元素不存储数据,只用来做索引,所有的数据存储在叶子节点中。
- 所有的叶子节点包含了所有元素的信息,以及指向这些元素记录的指针,且叶子节点本身元素依照关键字大小 自小到大顺序连接。
- 所有的中间节点都同时存在于子节点中,是子节点中最大或最小的元素。
MySQL 为什么使用 B+ 树:
- 如果我们使用 B+ 树作为底层的数据结构,那么所有只会访问或者修改一条数据的 SQL 的时间复杂度都是 O(log n),也就是树的高度,但是使用哈希却有可能达到 O(1) 的时间复杂度,它对于处理范围查询或者排序性能会非常差,只能进行全表扫描并依次判断是否满足条件它对于处理范围查询或者排序性能会非常差,只能进行全表扫描并依次判断是否满足条件。
- B+ 树时平衡树,查找任意节点的时间完全相同,由于数据都只存储在叶子节点上,所以每次查询都必须找到叶子节点,比较的次数就是树的高度,查询性能稳定。但 B+ 树 基本上就2 - 4层长得 “矮胖” 。三层就能存储千万级数据。
- B+树在查找对应记录时,并不会直接从树种找到对应的行记录,而只能获取到记录所在的页,再将整个页加载到内存中,再通过 PageDirectory 中存储的稀疏索引和 n_owned,next_record 属性取出对应的行记录,B-树是每个节点比较都加载到内存中,减少了I/O次数。
优点总结:
- 单一节点只放元素不存储数据,能够存储更多的消息,减少了查询的I/O次数。
- 每次查询都要查询到叶子结点,查询性能稳定。
- 每个叶子结点使用链表有序链接,便于范围查询。