在 mongoDB 中搜索索引数据的复杂度(Big-O)是多少?

Posted

技术标签:

【中文标题】在 mongoDB 中搜索索引数据的复杂度(Big-O)是多少?【英文标题】:What is the complexity (Big-O) of searching an indexed data in mongoDB? 【发布时间】:2012-08-02 11:52:56 【问题描述】:

这是针对设计问题。你能告诉我我是否正在索引如下所示的关键词。

obj = 
    name: "Apollo",
    text: "Some text about Apollo moon landings",
    tags: [ "moon", "apollo", "spaceflight" ]

确保这样的索引。

db.articles.ensureIndex(  tags: 1  );

和频繁查询如下。

db.articles.findOne(  tags: "apollo"  ).name

如果我插入了 n 个此类文档,请给我此类查询的性能。

是 O(1) 吗?

在此类数据上搜索正则表达式的性能如何?

【问题讨论】:

【参考方案1】:

这是一个 B-tree 索引,与几乎所有数据库一样,因此它的查找时间为 O(log n)。

正则表达式搜索听起来像是需要进行全表扫描或全索引扫描,两者都是 O(n)。如果表达式是前缀锚定的,它只需要扫描一个范围,但我想这仍然算作 O(n)。

【讨论】:

在 nosql 中是否可以接受 big o of n?严肃的问题。我是新来的开发人员。 取决于 N 有多大以及您需要它返回多快。它当然不能很好地扩展到大型集合。【参考方案2】:

正如 Thilo 所提到的,MongoDB 索引是作为“B-Tree”索引实现的,从根本上说,MongoDB 中的索引在操作上类似于其他数据库系统中的索引。在 MongoDB here 中有一个很好的索引概述。

我建议您阅读有关 indexing strategies 和 indexing operations 的信息,以帮助您进行实施、管理和设计。

为了帮助分析查询的性能并查看它们在做什么,您可以将 explain() 运算符附加到查询中。有关explain() 以及如何解释其输出的更多信息,请参阅here。

MongoDB 将PCRE 用于正则表达式。用法记录在here。除了 PCRE 库中的限制之外,没有大小限制。与所有正则表达式一样,请记住构造不良的正则表达式的后果:)

【讨论】:

以上是关于在 mongoDB 中搜索索引数据的复杂度(Big-O)是多少?的主要内容,如果未能解决你的问题,请参考以下文章

面试问题 - 在排序数组 X 中搜索索引 i 使得 X[i] = i

数据库中的索引 [重复]

inode索引节点和硬连接软连接(草稿)

如何在值列中搜索特定值并在 Big Query SQL 中替换为该特定值?

在 MongoDB 中的对象数组中搜索特定属性

如何从飞镖颤动中的键或键值对获取索引