B树和B+树的区别:
结构方面:
1.节点存储内容:
- B树: 节点同时存储索引和数据。
- B+树:只有叶子节点存储数据记录或指向数据记录的指针,非叶子节点只存键值,用于索引。 B + 树的非叶子节点可以存储更多的键值,从而拥有更宽的分支。
2.叶子结点关系:
- B树: 叶子节点之间没有特定的顺序或指针连接,它们是独立的,查找不同叶子节点中的数据时可能需要多次随机访问磁盘。
- B+树:所有叶子节点通过双向链表,这种结构使得范围查询变得非常高效。
操作效率方面:
1.查找效率:
- B树: 在进行查找时,可能在任何一个节点找到所需数据,查找路径相对不固定。
- B+树:查找操作必须到达叶子节点才能获取数据,路径相对固定。不过由于 B + 树的非叶子节点可以存储更多的键值,树的高度通常比 B 树小,因此在大多数情况下查找效率更高。
2.范围查找效率:
- B树:插入和删除操作可能会导致节点的分裂和合并,并且由于节点中同时存储键值和数据,操作相对复杂,需要更多的磁盘 I/O 操作。
- B+树: 插入和删除操作主要影响叶子节点,非叶子节点的结构相对稳定,操作相对简单,磁盘 I/O 次数较少。
MySQL 选用 B + 树作为索引结构的原因:
-
磁盘I/O效率高: 数据库索引通常存储在磁盘上,磁盘 I/O 操作是影响数据库性能的重要因素。B + 树的非叶子节点不存储数据,只存储键值,使得每个节点可以存储更多的键值,从而降低了树的高度。在进行查询时,减少了磁盘 I/O 的次数,提高了查询效率。
-
范围查询性能好: 例如查询某个时间段内的订单记录。B + 树的叶子节点通过指针连接成有序链表,使得范围查询可以通过顺序遍历链表来实现,大大提高了范围查询的效率。
-
插入和删除操作稳定: B + 树的插入和删除操作主要影响叶子节点,非叶子节点的结构相对稳定,这使得 B + 树在频繁的插入和删除操作下,仍然能够保持较好的性能,减少了节点分裂和合并的开销。
-
适合排序: 由于 B + 树的叶子节点是有序的,对于需要排序的查询操作,B + 树可以直接利用叶子节点的有序性,避免了额外的排序操作,提高了查询效率。