我有这样的查询:
[ [ ("X",True), ("Y",True), ("Z", True) ],
[ ("X",True), ("Y",True), ("Z", False) ],.... ]
我正在寻找为此构建最佳索引查询。我经常点击那个查询,我想做得更好。
我的文档在大多数情况下(99.9 +%)设置为db.sample.find({
bool1: false,
theNull: null,
existing: {$ne: null},
$or: [
{ bool2: false, string: {$in: [<array of strings>]}},
{ bool2: true, string: {$in: [<array of different strings>]}}
],
dateField: {$lt: ISODate(<Given date>)}
}).sort({dateField: -1});
的{{1}}和bool1
为空,而false
在95%的情况下为空 - 所以我需要那些字段(某处)来过滤掉它。
theNull
就是我的排序。现在,我感兴趣的数据集是existing
和dateField
- 我在那里对文档有变化,而且基本上是查询过滤的内容。
string
始终来自相对包含的字符串集(实际上是用户名),bool2
在非常少的文档中都是正确的。
string
主要与实际插入时间一致,但是在这里和那里存在差距,因为我必须将日期移回几个月才能获得一系列10-100个文档。
到目前为止,最好的结果是设置这些索引:
bool2
组合(ORed)与
dateField
我不确定使用此特定查询的最佳索引策略。
我尝试在查询中上下移动很多东西(例如,将{ string: 1, bool2: 1, creation_time: 1}
一直向下移动或者只是低于$或者。)
另外,我尝试将索引添加到各种组合中的所有字段。运行explain时我经常最终得到的是使用我的{string: 1, bool2: 1}
和existing
上设置的索引与另一个索引或string
,bool2
和{{ 1}}。
我可以将string
,bool2
,dateField
或其他各种组合放在该索引前面,但它们不会被使用。
我想知道为什么会这样,如果我能获得更好的性能(或者如果重要的话,可以获得更少的文档),如果我能在这些文档上获得更广泛的索引。
答案 0 :(得分:1)
这将是我尝试的第一个索引:
{ string: 1, creation_time: -1}
由于您的大多数变体位于string
,因此它是过滤的最佳列。我还以降序添加了creation_time
,因为当查询顺序和索引顺序匹配时,性能会更好。
您也可以通过加入bool2
获得更好的结果:
{ string: 1, bool2: 1, creation_time: -1}