2021-11-29 06:49:06
B树索引和B+树索引的核心区别体现在节点结构、数据分布、磁盘I/O效率及查询能力四个方面:
节点结构差异
B树的非叶子节点同时存储键值(key)和数据(data),而B+树的非叶子节点仅存储键值和指向子节点的指针,不存储实际数据。例如,在InnoDB中,页的默认大小为16KB,B+树非叶子节点因不存储数据,可容纳更多键值,从而增加树的“阶数”(子节点数量),使树更矮胖。这种结构差异直接导致B+树的层数通常低于B树,例如3层B+树可存储10亿数据(根节点常驻内存时仅需2次磁盘I/O),而B树可能需要更多层。
数据分布特点
B树的数据分散在所有节点中,每个节点可能包含数据记录;B+树的所有数据记录均存储在叶子节点,且叶子节点通过双向链表连接形成有序链表。这种设计使B+树的范围查询(如WHERE id BETWEEN 10 AND 100)、排序查询(ORDER BY)、分组查询(GROUP BY)和去重查询(DISTINCT)效率极高,只需遍历叶子节点链表即可完成,而B树需递归访问非叶子节点,逻辑复杂且效率较低。
磁盘I/O效率
B树的非叶子节点存储数据导致每个节点可容纳的键值数量减少,树的高度增加,查询时磁盘I/O次数增多。例如,存储相同数据量时,B树可能需要3次磁盘I/O,而B+树仅需2次。此外,B+树的叶子节点链表支持顺序访问,进一步优化了范围查询的I/O性能。
查询能力对比
B+树的非叶子节点仅作为索引层,数据集中在叶子节点,使得单点查询(如WHERE id = 28)的路径更短;而B树的单点查询需遍历从根到叶子的路径,且路径长度可能因数据分布不均而波动。B+树的叶子节点有序性还支持高效的范围扫描,例如在InnoDB中,通过主键索引的B+树结构,范围查询可直接利用叶子节点链表跳过中间节点,避免回表操作。