MySQL B树和B+树的区别

B树是一种多路平衡的查找树,它的每个节点最多包含k个孩子,k被称为B树的阶,k的大小取决于磁盘页的大小。

B树具有以下的特征:

[if !supportLists]1.[endif]根结点至少有2个子女;

[if !supportLists]2.[endif]每个中间节点都包含k-1个元素和孩子,其中m/2<= k <=m;

[if !supportLists]3.[endif]每个叶子节点都包含k-1个元素,其中m/2<= k <=m;

[if !supportLists]4.[endif]所有叶子节点都位于同一层;

[if !supportLists]5.[endif]每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子所包含元素的值域划分。

B树的查找比较快速,但是插入和删除就比较复杂了,所以B树主要用于文件系统以及部分数据库索引,比如MongoDB,MySQL中使用的是B+树索引。

B+树是B树的一种变种,有这比B树更加优秀的查询性能。

B+树具有以下特征:

[if !supportLists]1.[endif]有k个子树的中间节点包含k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据保存在叶子节点。

[if !supportLists]2.[endif]所有叶子节点包含了全部的元素信息,以及指向这些元素记录的指针,且叶子节点按照关键字的大小从小到大的顺序排列;

[if !supportLists]3.[endif]所有中间节点元素都同时存在于子节点,子节点是最大(或最小)元素。


MySQL是基于磁盘的数据库,索引是以索引文件的形式存在于磁盘中的,索引的查找过程就会涉及到磁盘IO消耗,磁盘IO的消耗相比较于内存IO的消耗要高好几个数量级,所以索引的组织结构要设计得在查找关键字时要尽量减少磁盘IO的次数。

B+树更适合外部存储(一般指磁盘存储),由于内节点(非叶子节点)不存储data,所以一个节点可以存储更多的内节点,每个节点能索引的范围更大更精确。也就是说使用B+树单次磁盘IO的信息量相比较B树更大,IO效率更高。

MySQL是关系型数据库,经常会按照区间来访问某个索引列,B+树的叶子节点间按顺序建立了链指针,加强了区间访问性,所以B+树对索引列上的区间范围查询很友好。而B树每个节点的key和data在一起,无法进行区间查找。

你可能感兴趣的:(MySQL B树和B+树的区别)