关于数据库索引为什么要选B+树一点自己的见解

首先从二叉树说起
树型结构的查询时间复杂度O(logN)
所以要选择树形结构
树形结构方便查找所以选用二叉搜索树
但为什么不用二叉搜索树
因为它具有不平衡性,如果插入连续递增序列,数据结构就会类似于链表
所以选用AVL树
但为什么又不用二叉搜索AVL树,因为AVL树是二叉,由于数据库储存数据量过于庞大,如果使用二叉树,会导致树的层数过高,增加IO次数,十分影响查询速度
所以选用多路查找树B树
但是为什么又不用B树要去用B+树
因为B+树的数据结构是叶子节点存放所有的值(聚簇索引),非叶子节点只做索引作用,并且叶子节点还用链表相连
根据计算机操作系统的数据存取的原理,每次按page查询时,会缓存当前查询数据附近的一页或者几页数据到主存中,由于有链式储存的结构,对于范围级数据连贯性较大的数据或者具有局部性的程序进行的查找,预读可以提高I/O效率。B+树的优势就显现出来了,查询数据附近数据都会被缓存在主存中,其附近的数据也通常会马上被使用。这样就可以极大的提高查询速度,毕竟主存查询速度是静态RAM查询的10倍,动态RAM查询的100倍。
多路查询树还可以减少IO次数,由于每次IO读取,需要经过,寻道时间,旋转时间,寻道时间由于预读的原理可以省略,然后只剩下极短的旋转时间,所以单次IO的效率会大大提高,再来说B+树的IO次数,由于计算机数据是按page(页)储存的,所以b+树每次会为一个叶子节点分配刚好一页的大小,这样就可以,每个物理节点也会储存到一页内,计算机储存也是按页对齐的,所以寻找一个node只需要一次IO

B-Tree中一次检索最多需要h-1次I/O(根节点常驻内存),渐进复杂度为O(h)=O(logdN)。一般实际应用中,出度d是非常大的数字,通常超过100,因此h非常小(通常不超过3)。

综上所述,如果我们采用B-Tree存储结构,搜索时I/O次数一般不会超过3次,所以用B-Tree作为索引结构效率是非常高的。

B+Tree更适合外存索引,原因和内节点出度d有关。从上面分析可以看到,d越大索引的性能越好,而出度的上限取决于节点内key和data的大小:

dmax=floor(pagesize/(keysize+datasize+pointsize))

floor表示向下取整。由于B+Tree内节点去掉了data域,因此可以拥有更大的出度,拥有更好的性能。

原创文章 28 获赞 26 访问量 3371

猜你喜欢

转载自blog.csdn.net/Avril___/article/details/104822280