关于这个问题,我觉得可以从以下几个方面来回答。
首先,常规的数据库存储引擎,都是使用B树或者B+树来实现索引的存储。而B树是一种多路平衡树,用这个存储结构来存储大量的数据,它的整个树的高度会矮很多(比如相比较于二叉树)。
对于数据库来说,数据的存储是在磁盘上的,众所周知,磁盘IO的效率是非常低的,特别是随机的磁盘IO效率会更低。所以,树的高度能够决定磁盘IO的次数,磁盘IO越少,对于性能的提升就越大。这就是为什么采用B树作为索引结构的原因。
在mysql的InnoDB存储引擎里,使用了一种增强的B树结构,也就是B+树来作为索引和数据的存储结构。相比较于B树,B+树做了几个方面的优化。
1. B+树所有的数据都存储在叶子节点,非叶子节点只存储索引。这意味着每一层存储的索引数量会增加,也就是在层高相同的情况下,B+树的存储量要比B树要多,磁盘IO次数更少。
2. B+树叶子节点的数据之间使用的是双向链表结构,所以在执行范围查询的时候,只需要在节点之间遍历就可以了,而B树需要遍历整棵树。
3. 在数据检索方面,由于数据都存储在叶子节点,所以B+树的IO次数更稳定一些。
4. 基于B+树的结构特点,如果采用自增的整型作为主键,可以避免增加数据的时候,带来叶子节点分裂导致的大量的运算的问题。
总的来说,技术方案的选型是为了解决特定业务场景的问题,也不是说B+树就一定是最优的选择,像MongoDB就是采用的B树的结构,这本质上也是关系型数据库和非关系型数据库的差异。