我正在对_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()也很烦人。
所以我想知道是否有更聪明的方法来做到这一点。
我不相信有任何方法可以做你想做的事情。_id索引不能被删除,你需要有第二个索引才能对你的数据执行覆盖(indexOnly)查询。
你真的需要只有一个索引吗?我怀疑你可能只需要提高速度或减少磁盘使用,但不能两者兼而有之。如果你确实需要提高速度和减少磁盘使用,你可能需要寻找不同的数据库解决方案,因为所有用于加速MongoDB查询的技术(索引、覆盖查询、分片等)都倾向于以增加磁盘使用来换取它们提供的速度提升。
编辑:
此外,如果调用hint困扰您,您可能可以将其关闭,因为MongoDB最终会重新优化其查询计划,如果它真的更快,它将切换到您的新索引。