Mysql准确点来说是innoDB这,所以大量使用这个b加树做索引,不是因为它看起来高级,而是因为官特别适合数据库这种基于磁盘页管理,而且经常要做范围查询的场景,先看为什么不是红黑树,红黑树本质上是二叉树,一个节点最多两个子节点,数据量一大,树的高度就会比较高,数据库查数据,它最怕的不是CPU多算几次,而是磁盘IO的一个次数太多,树越高意味着从根节点一路往下查的时候呢,可能要访问更多的磁盘页,性能自然就更差了.
而b+树呢,它是多叉平衡树,一个节点可以放很多key,还能挂很多子节点,这样同样规模的一个数据,b加树的层级会比红黑树低得多,通常3-4层就能支持非常大的一个数据量,层级低磁盘IO的一个次数就少,这才是关键啊,再看为什么不是Hash,Hash最大的一个问题不是查的慢,相反,等值查询它很快,但它不适合数据库里大量存在的一个范围查询和排序场景,比如你查where lD=10,Hash可能很好用,但你如果查wherelD>10 and id<100,或者要按某个字段去排序,Hash基本上就帮不上忙了,而b加树的一个key,它是天然有序的,所以它既能做等值查询,也很适合做范围查询,排序最左前缀匹配,这些都是数据库非常常见的一个需求,还有一个很重要的点,b加树特别适合磁盘页,数据库从磁盘读取数据的时候,不是一次读一条记录,而是按页读取,而是按页读取,比如innodb默认页的大小就是16KB,b加树的非叶子节点只存key和指针,不存整行的数据,所以一个页里可以放更多索引项,这样树就更矮更胖,同时真正的一个数据,通常集中在叶子节点,叶子节点之间还通过双向链表连接起来,做范围扫描的时候,只要先定位到起点,再顺着叶子节点往后扫就行,不需要反复回到上层节点,这也是它非常适合数据库的一个原因。
如果你想把这题答得更像做过项目,Innodb的一个主键索引是聚簇(cù)索引,数据就存放在叶子节点上,二级索引的叶子节点存的是主键值,所以通过二级索引查完整数据时,可能还要回表。
总结:
b加树它是多叉平衡树,层级低能减少磁盘的IO,它的key有序,适合范围查询和排序,非叶子节点只存索引信息,能提高单页装载的能力,叶子节点链表又让区间扫描更高效,正是因为这些特点,它才比红黑树和哈希更适合数据库的一个索引场景。
