提问者:小点点

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


我正在对_id进行范围查询,只需要从找到的文档中返回一个特定的字段(“数据”)。为了获得最佳性能,我想将此查询设为indexOnly。

这是查询:

db.集合.查找({_id:{$g te:"c",$lte:"d"}},{_id: 0,data:1})

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

db.集合.确保索引({_id: 1,data:1})

并告诉MongoDB将该索引用于:

db.集合.查找({_id:{$g te:"c",$lte:"d"}},{_id: 0,data:1}).hint({_id:1,data:1})

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

这符合预期并使查询仅索引。然而,即使不再需要标准_id索引,也不能删除它,这会导致双倍索引浪费大量空间。被迫始终在查询中使用hint()也很烦人。

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


共1个答案

匿名用户

我不相信有任何方法可以做你想做的事情。_id索引不能被删除,你需要有第二个索引才能对你的数据执行覆盖(indexOnly)查询。

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

编辑:

此外,如果调用hint困扰您,您可能可以将其关闭,因为MongoDB最终会重新优化其查询计划,如果它真的更快,它将切换到您的新索引。