前提具备知识点:【十一】MySQL中InnoDB及索引深入剖析(数据页、记录、页目录、B+树索引、聚簇索引、二级索引、索引优化 转自罗志赟)
一、Mysql不用B-树的原因
1.Mysql衡量查询效率指标之一磁盘IO次数,B+树节点小,磁盘IO次数少
B-树和B+树最重要的区别:B+树只有叶节点存放数据,其余节点用来索引,而B-树是每个索引节点都会有Data域。
这就决定了B+树更适合用来存储外部数据,也就是所谓的磁盘数据。
从Mysql(Inoodb)的角度来看,B+树是用来充当索引的,一般来说索引非常大,所以为了减少内存的占用,索引也会被存储在磁盘上。
B类树的特点就是每层节点数目非常多,层数很少,目的就是为了就少磁盘IO次数。
当查询数据的时候,最好的情况就是很快找到目标索引,然后读取数据,使用B+树就能很好的完成这个目的。
B-树的每个节点都有data域(指针),这增大了节点大小,增加了磁盘IO次数(磁盘IO一次读出的数据量大小是固定的,单个数据变大,每次读出的就少,IO次数增多),而B+树除了叶子节点其它节点并不存储数据,节点小,磁盘IO次数就少。
2.B+树更擅长范围查询
B+树所有的Data域在叶子节点,所有的叶子节点用指针串起来形成双向链表。这样遍历叶子节点就能获得全部数据,这样就方便范围查询。
B-树范围查询只能中序遍历
二、Mysql不用红黑树的原因
在大规模数据存储的时候,红黑树往往出现由于树的深度过大而造成磁盘IO读写过于频繁,进而导致效率低下的情况。
获取磁盘上数据,必须先通过磁盘移动臂移动到数据所在的柱面,然后找到指定盘面,接着旋转盘面找到数据所在的磁道,最后对数据进行读写。
磁盘IO代价主要花费在查找所需的柱面上,树的深度过大会造成磁盘IO频繁读写。
根据磁盘查找存取的次数往往由树的高度所决定,B类树可以有多个子女,从几十到上千,可以降低树的高度。