架构:
{
time_utc: "milliseconds",
city: "string",
age: "integer"
}
指数:
{
time_utc: 1,
city: 1,
age: 1
}
示例查询:
col.aggregate([
{
$match: { time_utc: { $exists: true } city: "new york", age: { $gt: 18 } }
},
{
$sort: { time_utc: -1 }
}
])
我确信在这个查询中将使用复合索引,这样排序就会高效。
然而,$match
文档/过滤阶段似乎效率不高,因为我们可以假设它time_utc
在整个集合中是唯一的。
假设集合中有 100 万个文档,只返回 10 个。我们进一步假设这 10 个文档位于排序的底部time_utc
。
在这种情况下,查询必须扫描索引的整个 100 万个值才能发现 10 个文档。这相当于完整的集合扫描。
让我们假设相反, 中只有 2 个唯一值time_utc
。在这种情况下,看起来city
和age
字段的索引实际上是有效的。
我的推理正确吗?