MongoDB索引 - 提高搜索/查询性能

时间:2015-10-22 10:05:41

标签: javascript mongodb performance indexing database

我一直在阅读mongoDB中的索引以提高查询性能。我在网上找到了很多有用的资源。

来自mongoDB文档here

  

索引支持在MongoDB中高效执行查询。如果没有索引,MongoDB必须执行集合扫描,即扫描集合中的每个文档,以选择与查询语句匹配的文档。如果查询存在适当的索引,MongoDB可以使用索引来限制必须检查的文档数

我完全理解上述内容。我找到了另一个非常有帮助的资源here

在这里,他们试图找到from_user" paasdude"没有索引。

db.tweets.find({'from_user':'paasdude'}).explain();
{
"cursor" : "BasicCursor",
"nscanned" : 51748,
"nscannedObjects" : 51748,
"n" : 35,
"millis" : 40,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
   }
 }

在这里,他们为"来自用户"添加索引。领域,从我的理解价值" 1"意味着按升序排序。

db.tweets.ensureIndex({'from_user' : 1});

在这里,他们试图找到from_user" paasdude"带索引。

db.tweets.find({'from_user':'paasdude'}).explain();
{
  "cursor" : "BtreeCursor from_user_1",
  "nscanned" : 35,
  "nscannedObjects" : 35,
  "n" : 35,
  "millis" : 3,
  "nYields" : 0,
  "nChunkSkips" : 0,
  "isMultiKey" : false,
  "indexOnly" : false,
  "indexBounds" : {
    "from_user" : [
        [
            "paasdude",
            "paasdude"
        ]
    ]
  }
}

很明显,添加索引后查询时间从40毫秒变为3。

我的问题:

虽然我理解索引的概念和需要,但我不明白它是如何工作的。

  1. 通过提供" from_user"字段索引为1对它进行排序 from_user字段是否按升序排列?

  2. 索引只能以升序(1)还是降序(-1)工作?

  3. 为什么简单地将一个索引1添加到from_user字段会将查询时间从40毫秒减少到3毫秒?

  4. 什么时候应该使用索引?

  5. 注意:如果这个问题超出了堆栈溢出的话题,我深表歉意。这是一个更具概念性的问题,我不确定在哪里可以问它。如果你知道一个更好的地方提出这个问题。请让我知道,我会移动它。

2 个答案:

答案 0 :(得分:2)

您已经回答了部分问题。索引支持MongoDB中查询的高效执行。如果没有索引,MongoDB必须执行集合扫描,即扫描集合中的每个文档,以选择与查询语句匹配的文档。如果查询存在适当的索引,MongoDB可以使用索引来限制它必须检查的文档数。举一个具体的例子,您可能使用索引来访问mongoDB文档,而不是从头到尾阅读文档,这必然为您节省了很多时间。

关于排序顺序,在您的情况下,排序顺序并没有太大的区别。如果查询返回大量记录并且输出按索引字段排序,则排序顺序变得更相关。在那种情况下,如果索引顺序与排序顺序匹配,则查询执行会更快。

当你需要创建一个索引时,它有点黑色艺术,但是,根据经验,你应该在字段上添加一个索引,如果你经常过滤它并且你的查询时间(变慢)。由于索引需要存储空间,并且在插入新记录时需要保持最新,因此通常优先考虑限制索引的数量。

答案 1 :(得分:0)

    1. 因为mongo没有"搜索"标准的文件。它查找索引并跳转到该地址。请查看this SO-Question以获得良好的概述。
    1. 很难回答。简短:如果你有很多读操作而没有那么多的写操作。