MongoDB查询索引$ gt和$ ne
询问
我有这样的查询:
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});
题
我正在寻找build立一个最佳的索引查询。 我打了很多,我想做得更好。
查询的部分
我的文档在大多数情况下(99.9%以上)将bool1
设置为false
, theNull
为null, existing
的95%的情况下不为null – 所以我需要这些字段(某处)将其过滤掉。
dateField
是我sorting。 现在,我的有趣的数据集是string
和bool2
– 这里是我有文档的变化,这基本上是查询过滤。
string
总是来自相对包含的一组string(实际上是用户名),而bool2
在文档数量非常less的情况下为真。
dateField
大部分是连续的,实际的插入时间,但是在这里和那里存在差距,因为在一系列10-100个文档中,我必须将date移回几个月。
我到目前为止做了什么
迄今为止最好的结果是设定这些指标:
{ string: 1, bool2: 1, creation_time: 1}
与…结合(ORed)
{string: 1, bool2: 1}
我不确定用什么最好的索引策略来使用这个特定的查询。
我试着在查询中上下移动很多东西(例如,将existing
一切移到下面或者在$或者下面)。
另外,我已经尝试在各种组合中为所有这些字段添加索引。 运行explain的时候,我经常会遇到这样的情况:使用在我的string
上设置的索引,并且使用bool2
或者另一个索引或者string
bool2
和dateField
。
我可以把bool
,那些在这个索引前面的那些theNull
, existing
或各种各样的组合,但是他们没有被使用。
我想知道这是为什么,如果我能得到更好的performance(如果有的话,取得更less的文档),如果我可以在这些文档更广泛的索引。
这将是我会尝试的第一个索引:
{ string: 1, creation_time: -1}
由于您的大部分变体都是以string
因此是过滤的最佳列。 当查询顺序和索引顺序匹配时,我还以降序添加了creation_time
,因为性能更好。
你也可以通过joinbool2
来获得更好的结果:
{ string: 1, bool2: 1, creation_time: -1}