为何mysql innodb索引是B+树数据结构

一、文件很大,不可能所有存储在内存中,因此要存在磁盘上mysql

二、索引的组织结构要尽可能减小查找过程当中磁盘I/O的存取次数(为何用B-/+Tree,还跟磁盘存取原理有关)sql

三、B+树全部的data域在叶子节点,通常来讲都会进行一个优化,就是将全部的叶子节点用指针串起来,这样遍历叶子节点就能得到所有数据数据库

 

2、什么是聚簇索引json

像innodb中,主键的索引结构中,既存储了主键值,有存储了行数据,这种数据成为‘聚簇索引’nosql

3、为何MongoDB采用B树索引,而mysql用B+树作索引性能

b+树只有叶节点存放数据,其他节点用来索引,b-树是每一个索引节点都会有data域优化

这就决定了B+树更适合用来存储外部数据,也就是所谓的磁盘数据设计

从mysql(innodb)的角度看,B+树是用来充当索引的,通常来讲索引很是大,尤为是关系型数据库这种数据量大的索引能达到亿级别,指针

因此为了减小内存的占用,索引也会被存储在磁盘上索引

那么mysql是如何衡量查询效率的呢,磁盘IO次数,B-树的特定就是每层节点数目很是多,层数不多,目的就是为了减小磁盘IO次数,当查询数据的时候,

最好的状况就是很快找到目标索引,而后读取数据,使用B+树就能很好的完成这个目的,可是B-树的每一个节点都有data域(指针),这无疑增大了节点大小,说白了增长了磁盘IO次数(磁盘IO一次读出的数据量大小是固定的,单个数据变大,每次读出的就少,IO次数增多,一次IO多耗时啊)

缘由1:B+树除了叶子节点其余节点并不存储数据,节点小,磁盘IO次数就少

缘由2:B+树全部的data域在叶子节点,通常来讲都会进行一个优化,就是将全部的叶子节点用指针串起来,这样遍历叶子节点就能得到所有数据

 

至于MongoDB为何使用B-树而不是B+树,能够从它的设计角度来考虑,它并非传统的关系型数据库,而是以json格式做为存储的nosql,目的就是高性能,高可用,易扩展。首先它摆脱了关系模型,上面所述的优势需求就没那么强烈了,其次mysql因为使用B+树,数据都在叶节点上,每次查询都须要访问到叶节点,而MongoDB使用B-树,全部节点都有data域,只要找到指定索引就能够进行访问,无疑单词查询平均快于mysql(但侧面来看mysql至少平均查询耗时差很少)

 

整体来讲,mysql选用B+树和MongoDB选用B-树仍是以本身的需求来选择的

相关文章
相关标签/搜索