一、B or B+ ?

关于mongodb的索引实现,我目前都不太确定是B+树,还是B树,因为mongodb的官方文档中明确说明使用B树实现的:
mongodb索引的实现使用B树.png
但是云栖上有人说问过WiredTiger的作者确认用的也是B+树:
WiredTiger引擎的作者说mongodb是用B+树实现的.png

本文并不想八卦谁对谁错,只单纯的分析mongodb理论上,用哪一种数据结构实现索引,更适合,只代表本人观点,说的不对,欢迎指正

二、B树与B+树各自的优缺点

B+是B树的进阶型,不同于B树的非叶子节点可以存储数据(或者是数据的物理地址),B+树中所有的数据都存放在叶子节点中,因此,查询速度非常稳定,详细对比见我的这篇[博客]。(https://segmentfault.com/a/11...

三、针对mongodb这种非sql数据库,哪一种数据结构更快?

耗时一上午检索,找到了几种mongodb使用B树的"强行"解释,我将其归为如下:
既然是非sql数据库,就应该好好利用其支持文本\复杂数据类型的优势,通过表结构的设计,保证数据库的使用者,通过单条查询就能拿到数据,而B树的遍历查询效率虽然不如B+树,但是由于非叶子节点直接就能拿到并返回数据,因此单条查询速度是快于B树的
典型例子见这2篇博客1|博客2
以下是本人观点:
B树的单条查询确实是会更快,但是以本人所经历的项目经验来说,mongodb的表不会都是单条查询的场景,更多的使用场景还是基于几个属性的遍历,当然这可以通过创建复合索引去加快查找速度,然而创建多个索引,本身就会极大的降低数据库写的性能,创建多个索引之后读的性能也不会对比B+树有更多的优势。
综上,如果本人作为引擎的开发者,会选择B+树作为实现索引的数据结构,尽管这牺牲了一部分单条查询的性能,但是常用场景下查询的性能更为可靠。


关翔宇
10 声望3 粉丝

即使是一只蜗牛,不停努力的奔跑,也能到达目标