B+树索引是啥?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了B+树索引是啥?相关的知识,希望对你有一定的参考价值。

什么是B+树索引?
有人可以帮忙解释解析下吗?
最好带图带下列子。。。。

先从数据结构的角度来答。题主应该知道B-树和B+树最重要的一个区别就是B+树只有叶节点存放数据,其余节点用来索引,而B-树是每个索引节点都会有Data域。这就决定了B+树更适合用来存储外部数据,也就是所谓的磁盘数据。从mysql(Inoodb)的角度来看,B+树是用来充当索引的,一般来说索引非常大,尤其是关系性数据库这种数据量大的索引能达到亿级别,所以为了减少内存的占用,索引也会被存储在磁盘上。那么Mysql如何衡量查询效率呢?磁盘IO次数,B-树(B类树)的特定就是每层节点数目非常多,层数很少,目的就是为了就少磁盘IO次数,当查询数据的时候,最好的情况就是很快找到目标索引,然后读取数据,使用B+树就能很好的完成这个目的,但是B-树的每个节点都有data域(指针),这无疑增大了节点大小,说白了增加了磁盘IO次数(磁盘IO一次读出的数据量大小是固定的,单个数据变大,每次读出的就少,IO次数增多,一次IO多耗时啊!),而B+树除了叶子节点其它节点并不存储数据,节点小,磁盘IO次数就少。这是优点之一。另一个优点是什么,B+树所有的Data域在叶子节点,一般来说都会进行一个优化,就是将所有的叶子节点用指针串起来。这样遍历叶子节点就能获得全部数据,这样就能进行区间访问啦。至于MongoDB为什么使用B-树而不是B+树,可以从它的设计角度来考虑,它并不是传统的关系性数据库,而是以Json格式作为存储的nosql,目的就是高性能,高可用,易扩展。首先它摆脱了关系模型,上面所述的优点2需求就没那么强烈了,其次Mysql由于使用B+树,数据都在叶节点上,每次查询都需要访问到叶节点,而MongoDB使用B-树,所有节点都有Data域,只要找到指定索引就可以进行访问,无疑单次查询平均快于Mysql(但侧面来看Mysql至少平均查询耗时差不多)。总体来说,Mysql选用B+树和MongoDB选用B-树还是以自己的需求来选择的。 参考技术A B+ 树是对 B 树的一个小升级。大部分数据库的索引都是基于 B+ 树存储的。MySQL 的 MyISAM 和 InnoDB 引擎的索引都是基于 B+ 树存储。
B+ 树最大的几个特点:
1. 非叶子节点只保留 KEY,放弃 DATA;
2. KEY 和 DATA一起,在叶子节点,并且保存为一个有序链表(正序,反序,或者双向);
3. B+ 树的查找与 B 树不同,当某个结点的 KEY 与所查的 KEY 相等时,并不停止查找,而是沿着这个 KEY 左边的指针向下,一直查到该关键字所在的叶子结点为止。

MySQL:索引B+树和数据是啥关系?

MySQL(1):索引、B+树和数据是啥关系?

索引和数据的关系就是目录和具体的书页的关系,只是在搜索的时候起作用;这句话没有任何问题,但是看下一句话:每个索引在InnoDB里面对应一棵B+树,数据库的数据是存在B+树里面的?

这就糊涂了,一个索引对应一棵B+树,数据又存在B+树里面,那多建几个索引就要多建几棵树,那数据岂不是也要复制几份?并不会!!!

img

直接用大佬的图了,数据是在磁盘里面的可以说是死的,不会因为多几个索引就复制几份!!!

mysql是怎么存储数据的?

数据存在磁盘的一个文件里面——》ibd文件,ibd里面既有索引数据(飞叶子节点Page),也有具体的数据(叶子结点Page)。索引数据和具体数据一起组成了B+树,所以说数据存在B+树里面。

每一个Page里面有好多条数据(记录)。

ibd文件被分为连续的大小相同的区域,称为页(Page),大小默认值为16KB,可以设置。页的大小固定,格式固定。

多个Page在一起构成一颗多路平衡树, Page作为树的节点, 在平衡树的基础上, 同一层的节点左右相连, 所以称为B+树;

树中: 非叶子节点保存主键和子节点的位置, 叶子节点保存完整的记录;

mysql叶子结点存储的什么_B+树叶子结点到底存储了什么?

数据和主键索引是混合在一起存储的!每个表是一个ibd文件

总结

很关键的一点,数据是存在ibd文件里面的,和主键索引一起存,构成了B+树!InnoDB数据是存在B+树这一点没错,只不过是存在主键索引构成的B+树!

以上是关于B+树索引是啥?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL:索引B+树和数据是啥关系?

MySQL:索引B+树和数据是啥关系?

索引第一篇:B+树索引哈希索引全文索引

索引第一篇:B+树索引哈希索引全文索引

数据库索引(Index)

索引是什么,索引的数据结构.B树,B+树