3
問題: 我有一個非常大的集合由場ts
索引:(時間戳)MongoDB:爲什麼不按多個鍵使用索引進行排序?
> 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
}
]
]
}
}
這確實是答案 - 我猜關係的DB已經把我寵壞了... :)謝謝! – johndodo
爲什麼排序列必須是索引中的最後一列? –