gpt4 book ai didi

MongoDB:为什么按多个键排序不使用索引?

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

问题:我有一个非常大的集合,由字段 ts: (timestamp)

索引
> db.events.ensureIndex({'ts': -1})

我想获取最后 5 个条目。令我惊讶的是查询不使用索引,因此非常慢:

> db.events.find().sort({'ts': -1, '_id': -1}).limit(5)

但是,仅按 ts 或其他字段排序应该使用索引:

> db.events.find().sort({'ts': -1}).limit(5)
> db.events.find().sort({'_id': -1}).limit(5)

这是 MongoDB 中的一个错误,这确实是一个记录在案的功能还是我做错了什么?

附加信息:

> db.events.find().sort({'ts': -1, '_id': -1}).limit(5).explain()
{
"cursor" : "BasicCursor",
"nscanned" : 795609,
"nscannedObjects" : 795609,
"n" : 5,
"scanAndOrder" : true,
"millis" : 22866,
"nYields" : 73,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {

}
}
> db.events.find().sort({'ts': -1}).limit(5).explain()
{
"cursor" : "BtreeCursor ts_-1",
"nscanned" : 5,
"nscannedObjects" : 5,
"n" : 5,
"millis" : 0,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
"ts" : [
[
{
"$maxElement" : 1
},
{
"$minElement" : 1
}
]
]
}
}

最佳答案

Indexing Strategies 值得一读索引建议和常见问题解答 wiki 页面的部分。

您可能遗漏了一些注意事项:

  • MongoDB 每次查询只使用一个索引

  • 使用的排序列必须是索引中的最后一列

因此,对于您的示例,您应该在 ts_id 上添加复合索引:

db.events.ensureIndex({'ts':-1, '_id':-1});

.. 并使用 explain() 确认排序现在正在使用预期的索引:

> db.events.find().sort({'ts': -1, '_id':-1}).limit(5).explain()
{
"cursor" : "BtreeCursor ts_-1__id_-1",
"nscanned" : 5,
"nscannedObjects" : 5,
"n" : 5,
"millis" : 0,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
"ts" : [
[
{
"$maxElement" : 1
},
{
"$minElement" : 1
}
]
],
"_id" : [
[
{
"$maxElement" : 1
},
{
"$minElement" : 1
}
]
]
}
}

关于MongoDB:为什么按多个键排序不使用索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12072569/

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