一位从业8年的爱好者私信提问。他说他去阿里面试的时候被问到这个问题。他查了很多资料,也想不通。他希望我能帮他解答。问题是:“Mysql为什么要用B+Tree作为索引结构?”关于这个问题,看看普通人和专家的回答。普通人:B+号的特点是与B号相比,它的非叶子节点不存储数据,所有数据都存在于叶子节点中。与B号相比,它的查询次数和IO次数会更加稳定。师父:这个问题我从几个方面来回答。首先,传统的数据库存储引擎一般使用B-树或B+树来存储索引。因为B树是多路平衡树,使用这种存储结构来存储大量的数据,其整体高度会比二叉树矮很多。对于数据库来说,所有的数据都必须存储在磁盘上,磁盘IO的效率其实很低,尤其是随机磁盘IO的情况下。因此,树的高度可以决定磁盘IO的数量。磁盘IO次数越少,性能提升越大。这就是使用B树作为索引存储结构的原因。但是在Mysql的InnoDB存储引擎中,它使用了一种增强的B树结构,即B+树作为索引和数据的存储结构。与B树结构相比,B+树在几个方面进行了优化。B+树的所有数据都存放在叶子节点中,非叶子节点只存放索引。叶节点中的数据使用双向链表关联。我认为使用B+树来实现索引有几个原因。B+树的非叶子节点不存储数据,所以每一层可以存储的索引数会增加,也就是说在层高相同的情况下B+树比B树存储更多的数据,导致更少的磁盘IO。在Mysql中,范围查询是一个比较常见的操作,B+树的叶子节点存储的所有数据都与一个双向链表相关联,所以查询时只需要查找两个节点进行遍历,而B树需要获取所有节点,所以B+树在范围查询上效率更高。在数据检索方面,由于所有的数据都存储在叶子节点中,所以B+树的IO数会更加稳定。因为叶子节点存储了所有的数据,所以B+树的全局扫描能力更强,因为它只需要扫描叶子节点。但是B树需要遍历整棵树。另外,基于B+树的结构,如果使用自增整数数据作为主键,可以更好的避免新增数据时,叶子节点分裂带来的大量计算问题。总的来说,我认为技术方案的选择更多的是针对当前场景下的具体问题进行解决。并不一定意味着B+树就是最好的选择,就像MongoDB中使用的B-tree结构一样。也就是说,其实就是关系型数据库和非关系型数据库的区别。以上是我对这个问题的理解。综上所述,“为什么选择xx科技”这个问题其实很好回答。只要足够了解技术本身的特性,自然就会知道为什么要这样设计。就像,在业务开发中,我们知道什么时候用List,什么时候用Map,道理是一样的。有什么面试问题,职业发展问题,学习问题可以私信我。版权声明:除特别声明外,本博客所有文章均采用CCBY-NC-SA4.0许可协议。转载请注明来自Mic带你学建筑!如果本文对您有帮助,请给个关注和点赞。您的坚持是我不断创作的动力。欢迎关注同名微信公众号获取更多技术干货!
