如何在MongoDB中使用_id字段有效地添加复合索引

时间:2014-03-07 14:38:12

标签: mongodb mongodb-query

我正在对_id进行范围查询,并且只需要从找到的文档中返回一个特定字段(" data")。我想使这个查询indexOnly以获得最佳性能。

以下是查询:

  

db.collection.find({_ ID:{$ GTE:&#34; C&#34;,$ LTE:&#34; d&#34;}},{_ ID:0,数据:1})< / p>

这个查询当然不是indexOnly所以我需要添加另一个索引:

  

db.collection.ensureIndex({_ ID:1,数据:1})

告诉MongoDB使用该索引:

  

db.collection.find({_ ID:{$ GTE:&#34; C&#34;,$ LTE:&#34; d&#34;}},{_ ID:0,数据:1})。提示({_ ID:1,数据:1})

(需要提示,因为否则MongoDB将使用标准的_id索引进行查询。)

这可以按预期工作,并使查询indexOnly。但是,即使不再需要标准_id索引,也无法删除标准_id索引,这会导致双倍索引浪费大量空间。被迫总是在查询中使用hint()也很烦人。

所以我想知道是否有更聪明的方法来做到这一点。

1 个答案:

答案 0 :(得分:0)

我不相信有任何办法可以做你想要的。 The _id index cannot be removed,您需要拥有第二个索引才能对数据执行覆盖(indexOnly)查询。

你真的需要只有一个索引吗?我怀疑你可能只需要提高速度或减少磁盘使用量,但不是两者都要求。如果确实需要提高速度和减少磁盘使用量,则可能需要寻找不同的数据库解决方案,因为用于加速MongoDB查询(索引,覆盖查询,分片等)的所有技术都倾向于交易增加了磁盘使用量,以获得他们提供的速度提升。

编辑:

此外,如果对提示的调用困扰你,你可以将其关闭,因为MongoDB最终会re-optimize it's query plan,如果它真的更快,它将切换到你的新索引。