我一直在阅读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。
我的问题:
虽然我理解索引的概念和需要,但我不明白它是如何工作的。
通过提供" from_user"字段索引为1对它进行排序 from_user字段是否按升序排列?
索引只能以升序(1)还是降序(-1)工作?
为什么简单地将一个索引1添加到from_user字段会将查询时间从40毫秒减少到3毫秒?
什么时候应该使用索引?
注意:如果这个问题超出了堆栈溢出的话题,我深表歉意。这是一个更具概念性的问题,我不确定在哪里可以问它。如果你知道一个更好的地方提出这个问题。请让我知道,我会移动它。
答案 0 :(得分:2)
您已经回答了部分问题。索引支持MongoDB中查询的高效执行。如果没有索引,MongoDB必须执行集合扫描,即扫描集合中的每个文档,以选择与查询语句匹配的文档。如果查询存在适当的索引,MongoDB可以使用索引来限制它必须检查的文档数。举一个具体的例子,您可能使用索引来访问mongoDB文档,而不是从头到尾阅读文档,这必然为您节省了很多时间。
关于排序顺序,在您的情况下,排序顺序并没有太大的区别。如果查询返回大量记录并且输出按索引字段排序,则排序顺序变得更相关。在那种情况下,如果索引顺序与排序顺序匹配,则查询执行会更快。
当你需要创建一个索引时,它有点黑色艺术,但是,根据经验,你应该在字段上添加一个索引,如果你经常过滤它并且你的查询时间(变慢)。由于索引需要存储空间,并且在插入新记录时需要保持最新,因此通常优先考虑限制索引的数量。
答案 1 :(得分:0)