繁体   English   中英

MongoDB索引-改善搜索/查询性能

[英]MongoDB indexing - to improve search/query performance

我一直在阅读有关在mongoDB中建立索引以提高查询性能的信息。 我在网上发现了许多有用的资源。

从MongoDB的文档在这里

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

我理解上述completely.I发现了另一个资源这是令人惊讶的有益这里

他们在这里尝试查找没有索引的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. 为什么仅通过在from_user字段中添加索引1来将查询时间从40毫秒减少到3毫秒?

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

注意:对于此问题对于堆栈溢出而言,我很抱歉。 这是一个更具概念性的问题,我不确定还有什么要问的。 如果您知道一个更好的地方问这个问题。 请让我知道,我将移动它。

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

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

当您需要创建索引时,这有点荒唐,但是,根据经验,如果经常过滤索引并且查询时间变慢,则应在字段上添加索引。 由于索引需要存储空间,并且在插入新记录时需要保持最新,因此通常最好限制索引的数量。

    1. 是。
    1. 是。
    1. 因为mongo不必“搜索”文档中的条件。 它在索引上查找并跳转到地址。 查看 SO-Question以获得很好的概述。
    1. 很难回答。 简短:如果您有很多读取操作,而没有那么多写入操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM