我有复合索引:
{
"hidden" : 1,
"country" : 1,
"edited" : 1,
"changeset.when" : -1
}
并查询:
{
"country" : "ua",
"edited" : true,
"hidden" : false,
"changeset.when" : { "$lt" : ISODate("5138-11-16T09:46:40Z") }
}
它运作良好且快速。现在,我要对结果进行排序:{ "changeset.when" : -1 }
,它会减慢很多速度。从几百毫秒到15秒。
这是排序查询的说明:
"winningPlan" : {
"stage" : "SORT",
"sortPattern" : {
"changeset.when" : -1
},
"limitAmount" : 15,
"inputStage" : {
"stage" : "SORT_KEY_GENERATOR",
"inputStage" : {
"stage" : "FETCH",
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"hidden" : 1,
"country" : 1,
"edited" : 1,
"changeset.when" : -1
},
"indexName" : "edited_news",
"isMultiKey" : true,
"multiKeyPaths" : {
"hidden" : [ ],
"country" : [ ],
"edited" : [ ],
"changeset.when" : [
"changeset"
]
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"hidden" : [
"[false, false]"
],
"country" : [
"[\"ua\", \"ua\"]"
],
"edited" : [
"[true, true]"
],
"changeset.when" : [
"(new Date(100000000000000), true)"
]
}
}
}
}
}
为什么这么慢?说明显示它成功使用了所需的索引,并且字段changeset.when
降序排列。
答案 0 :(得分:1)
如果您有复合索引,请尝试创建查询键序列,例如索引序列。它将带来更多性能。
您无需对结果进行其他排序,默认情况下,结果将根据索引进行排序(在您的情况下,结果将按changeset.when
降序排序)
有关更多信息,请共享您收藏中的一些文档。
如果您有任何疑问,请随时提问