包含日期范围的最佳 Mongo 指数策略是什么



我有以下模式:

{
a: string;
b: date;
c: number;
}

我的查询是

find({
a: 'some value',
b: {
$gte: new Date('some date')
}
})
.sort({ 
c: -1
});

我有一个索引是:

{ a: 1, b: 1, c: 1 }

但它没有使用此索引。

我还有其他几个索引,在分析我的 explain(( 时,它显示它正在使用多个其他索引来完成我的查询。

我相信由于我的"b"查询是一个日期范围,因此不被视为相等条件,所以也许该索引不起作用?

我应该有两个索引: { a: 1, c: 1} 和分别 { b: 1 }

日期往往比其他字段更具选择性,因此当您有一个看起来像{dateField: 1, otherField: 1}的索引时,dateField的选择性意味着otherField将毫无用处,除非您有多个项目共享同一日期。

根据您的数据分布实际情况,您可能会考虑{otherField: 1, dateField: 1}(这意味着 mongo 可以按排序顺序检查文档是否与您的日期查询匹配(。通常,将排序字段放在范围查询中使用的任何字段之前是一个好主意。

Mlab 的索引文档是我见过的关于索引使用的最佳资源,他们建议:

对于具有排序的查询,一个好的经验法则是按以下顺序对索引字段进行排序:

  • 首先,要查询精确值的字段
  • 二、一个小$in阵列
  • 第三,您将按照与排序本身相同的顺序和规范进行排序的字段(对多个字段进行排序(
  • 最后,您将按从最有选择性到最不选择性的顺序查询一系列值的字段(请参阅下面的范围运算符(

最新更新