MySQL为什么选择B+树做索引

B树 与 B+树 的区别

B树

  1. B Tree的基本概念:所有的叶子节点的高度都是一样,这个保证了每次查询数据的时候都是稳定的查询效率,不会因为运气的影响
  2. B Tree中其实每个非叶子节点内的小节点内其实都是一个二元组[key, data],key其实就是下图的那个25这种的,然后这个data其实对应的就是数据库中id等于25这条完整的数据记录的内存地址(因为在Myisam中他是数据和索引数据是分开的)
    MySQL为什么选择B+树做索引_第1张图片

B树的特点:

  1. 首先B Tree的每一个节点上其实是有date的,这个date其实就是要查找的数据
  2. 然后是B Tree查询的效率不够稳定,他有可能在第一个节点中就查到了数据,并且返回
  3. 他的键值(索引和对应的值)其实都是分布在整棵树上的节点上的任何一个节点

B+树

  1. 在B+树中,所有的非叶子节点不存储要查找的data数据,只存储索引
  2. 所有要查找的data数据只存放在在叶子节点上
  3. 叶子节点之间的数据是一个双向链表(互相指向)

下图的一颗B树,是一个高度为2,每一页可以放4条记录,扇出是5。
MySQL为什么选择B+树做索引_第2张图片

MySQL为什么选择B+树做索引

重点原因一

  1. B+ Tree有一个很大的改变就是他的每一个非叶子节点的内节点中都没有date这个概念了,都存储索引数据,因为他的date都放在了叶子节点上,这样的一个最大的好处就利用了局部性原理(当一个数据被用到时,其附近的数据也通常会马上被使用)
    磁盘预读原理:
    • 磁盘预读的特性(磁盘往往不是严格按需读取,而是每次都会预读,即使只需要一个字节,磁盘也会从这个位置开始,顺序向后读取一定长度的数据【这个一定的长度就是一个节点的大小设置为16K】放入内存)
    • 接着上面的:预读的长度一般为页(page)的整倍数。页是计算机管理存储器的逻辑块,硬件及操作系统往往将主存和磁盘存储区分割为连续的大小相等的块,每个存储块称为一页(在许多操作系统中,页得大小通常为4k),主存和磁盘以页为单位交换数据。当程序要读取的数据不在主存中时,会触发一个缺页异常,此时系统会向磁盘发出读盘信号,磁盘会找到数据的起始位置并向后连续读取一页或几页载入内存中,然后异常返回,程序继续运行。
  2. 由于上面我们说的预读原理,因为B+ Tree中节点的非叶子节点无 data 域,其实就是因为没有date域了,但是每次IO的页的大小是固定的,但是B+Tree中非叶子节点无date域,那么肯定每次IO读取若干个块块中包含的Key域的值肯定更多,B+树单次磁盘 IO 的信息量大于B树,从这点来看B+树相对B树磁盘 IO 次数少。
  3. 数据库系统的设计者巧妙利用了磁盘预读原理,将一个节点的大小设为等于一个页,这样每个节点只需要一次I/O就可以完全载入
  4. 为了达到这个目的在实际实现B-Tree还需要使用如下技巧:每次新建节点时,直接申请一个页的空间,这样就保证一个节点物理上也存储在一个页里,加之计算机存储分配都是按页对齐的,就实现了一个node只需一次I/O。

重点原因二

  1. B+Tree中因为数据都在叶子节点,所以每次查询的时间复杂度是固定的,因为稳定性保证了
  2. 而且叶子节点之间都是链表的结构,所以B+ Tree也是可以支持范围查询的,而B树每个节点 key 和 data 在一起,则无法区间查找。

你可能感兴趣的:(MySQL)