我真的很喜欢MongoDB,我在工作和家庭中都使用它,但是还没有遇到性能,复杂性或限制性问题。但是我一直在思考索引,但有一个问题我找不到合适的答案。
大规模SQL数据库的主要问题之一是查询的相对复杂性。具体来说,MySQL对大多数索引使用b树,这种查询比线性查询要花O(log(n))更好,但仍然意味着您拥有的数据越多,花费的时间就越长。
NoSQL数据库的一大吸引力在于消除/缓解了这种扩展问题,通常依赖于哈希样式索引,该索引具有O(1)查找时间,因此拥有更多数据不会降低应用程序的运行速度。这是我的问题所在:
根据官方的MongoDB文档,Mongo中的所有索引都使用b树。尽管Mongo实际上确实具有哈希索引,但据我所知,它们仍存储在b树中,与_id字段上的索引相同。在Mongo的文档中,我什至找不到任何能表明恒定时间的东西!
所以我的问题是这样的:实际上,Mongo中的所有索引(包括_id和哈希值)是否都存储在b树中?这是否意味着查询键(甚至通过_id来查询)实际上需要O(log(n))时间?
附录:值得注意的是,如果Mongo文档在示例查询中提供了一些复杂度公式,那将是一件很棒的事情。我最喜欢的示例是Redis文档。
另外:这是相关的。但是,我还添加了有关哈希索引和(更重要的是)_id索引的特定问题。
如果查看mongodb中用于索引的代码(在此处),您可以轻松地看到它正在使用btree进行索引。因此,该算法的顺序O(log n)
,但这对数函数的基础不是2,而8192代替,这是这里的代码。
因此,对于一百万条记录,我们只有两个级别(假设树是平衡的),这就是为什么它可以如此快地找到记录的原因。总的来说,顺序是对数的,但由于此对数函数的基数很大,因此增长缓慢。