大家好,欢迎收看猿话!
BTree意思是多路平衡查找树,它是一种数据结构。MySQL的InnoDB和MyISAM存储引擎,都是使用它来存储索引。BTree可细分为B-Tree和B+Tree,B+Tree是B-Tree的升级版。MySQL的InnoDB和MyISAM存储引擎使用的是B+Tree。
为了描述B-Tree,首先定义一条记录为一个二元组[key, data] ,key为记录的键值,对应表中的主键值,data为一行记录中除主键外的数据。对于不同的记录,key值互不相同。如下图中的紫色部分就是key,橙色部分就是一行数据,绿色部分就是指针。
一棵m阶的B-Tree有如下特性:
假设以根节点为例,关键字为17和35,P1指针指向的子树的数据范围为小于17,P2指针指向的子树的数据范围为17~35,P3指针指向的子树的数据范围为大于35。
当我们要查找关键字29时:
分析上面过程,发现需要3次磁盘I/O操作,和3次内存查找操作。由于内存中的关键字是一个有序表结构,可以利用二分法查找提高效率。而3次磁盘I/O操作是影响整个B-Tree查找效率的决定因素。B-Tree相对于AVLTree缩减了节点个数,使每次磁盘I/O取到内存的数据都发挥了作用,从而提高了查询效率。
从上一节中的B-Tree结构图中可以看到,每个节点中不仅包含数据的key值,还有data值。而每一个页的存储空间是有限的,一般为16K(也可以调整),如果data数据较大时将会导致每个节点(即一个页)能存储的key的数量很小。当存储的数据量很大时同样会导致B-Tree的深度较大,增大查询时的磁盘I/O次数,进而影响查询效率。
为解决这个问题,在B-Tree基础上就产生了一种新的数据结构B+Tree。
一棵m阶的B+Tree的特性和m阶的B-Tree基本相同,除了以下几点:
虽然,MySQL的InnoDB和MyISAM存储引擎使用的都是B+Tree结构,但是它们也有不同之处: