复合指数
{
A: 1,
timestamp: 1,
}
and
{
B: 1,
timestamp: 1,
}
db.user.aggregate([
{ $match: {
$or: [ { A: "some_value" }, { B: "some_value" } ]
} },
{
$sort: {
timestamp: 1
}
},
{
$limit: 1000
}
])
问题是,
$sort
和$limit
阶段会因为$or
中的$match
而成为阻塞阶段吗?
如果没有
$or
,我知道索引将用于执行排序。
我认为更好的表达问题的方式是:
我这么说并强调“可以”的原因是因为通常无法保证数据库优化器的计划选择。因此,了解它的能力以及在某种程度上了解该方法的好处通常是有益的,以便适当地推理可能发生的情况。索引能否提供所请求的排序,从而防止数据库处理此聚合时出现阻塞阶段?
不同意
评论中的回答,重新表述的问题的答案是数据库可以确实使用索引来提供排序。将您的示例放入 this mongoplayground 示例 会生成一个 explain
计划,其中包括
SORT_MERGE
阶段。这是一个流变体,它组合了按请求顺序扫描两个索引的排序序列。这在
此处的文档中得到了直接确认,其中指出:
再次强调,仅仅因为系统$或和排序操作 当使用
$or
执行sort()
查询时,MongoDB 可以使用支持$or
子句的索引。
可以这样做并不意味着它总是将会。有许多因素,特别是 $or
运算符中的子句数量,会影响选择此类计划的可能性。