gpt4 book ai didi

mongodb - 有索引的搜索时间 > 无索引

转载 作者:可可西里 更新时间:2023-11-01 09:28:18 25 4
gpt4 key购买 nike

我有一个包含 200000 个文档对象的集合“numbers”,{number: i} i = 1 到 200000。

没有任何索引 $gt:10000 给出 nscanned 200000 和 115 毫秒。使用数字 $gt 上的索引:10000 给出 nscanned 189999 和 355 毫秒。

为什么要花更多时间在索引上?

> db.numbers.find({number: {$gt: 10000}}).explain()
{
"cursor" : "BasicCursor",
"nscanned" : 200000,
"nscannedObjects" : 200000,
"n" : 189999,
"millis" : 115,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {

}
}

> db.numbers.ensureIndex({number: 1})

> db.numbers.find({number: {$gt: 10000}}).explain()
{
"cursor" : "BtreeCursor number_1",
"nscanned" : 189999,
"nscannedObjects" : 189999,
"n" : 189999,
"millis" : 355,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
"number" : [
[
10000,
1.7976931348623157e+308
]
]
}
}

最佳答案

在这种情况下,索引没有帮助,因为您的匹配结果集几乎包含整个集合。这意味着它必须加载到 RAM 中并遍历大部分索引,以及加载到 RAM 中并遍历文档本身。

如果没有索引,它只会进行表扫描,检查每个文档并在匹配时返回。

在这种查询几乎要返回整个集合的情况下,索引可能没有帮助。

添加 .limit() 将加快查询速度。您还可以强制查询优化器不使用带有 .hint() 的索引:

db.collection.find().hint({$natural:1})

您还可以强制查询直接从索引本身提供结果值,方法是将所选字段限制为仅已编制索引的字段。这允许它避免在进行索引扫描后加载任何文档。

试试看解释输出是否指示 "indexOnly":true

db.numbers.find({number: {$gt: 10000}}, {number:1}).explain()

详情在这里:

http://www.mongodb.org/display/DOCS/Retrieving+a+Subset+of+Fields#RetrievingaSubsetofFields-CoveredIndexes

关于mongodb - 有索引的搜索时间 > 无索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9792244/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com