3

我正在使用 Codeigniter (PHP) 和 MongoDB 构建一个 webapp。我正在创建索引并且有一个问题。

如果我要查询三个字段(_id、状态、类型)并想创建一个索引,我是否需要在确保这样的索引时包含 _id:

db.comments.ensureIndex({_id: 1, status : 1, type : 1});

或者这会到期吗?

db.comments.ensureIndex({status : 1, type : 1});
4

3 回答 3

5

如果要将其包含在复合索引中,则需要明确包含_id在您的调用中。ensureIndex但是因为过滤_id已经提供了单个文档的选择性,这很少是正确的事情。我认为只有当您的文档非常大并且您尝试使用覆盖索引时才有意义。

于 2012-07-03T13:56:38.840 回答
3

MongoDB 目前每个查询只使用一个索引,但查询除外$or。如果您的常见查询总是在这三个字段(_id、状态、类型)上进行搜索,那么复合索引会很有帮助。

在 DB shell 中,您可以在查询中使用explain()命令来获取有关所使用索引的信息。

于 2012-07-03T13:23:29.813 回答
-3

您不需要在 _id 字段上隐式创建索引,它会自动完成。请参阅mongo 文档

_id 索引

对于除上限集合之外的所有集合,会自动为 _id 字段创建索引。这个索引是特殊的,不能被删除。_id 索引强制其键的唯一性(除了一些分片的情况)。

于 2012-07-03T13:21:24.503 回答