我正在使用Codeigniter(PHP)和MongoDB构建一个webapp。 我正在创建索引并有一个问题。
如果我在三个字段(_id,status,type)上查询并且想要 创建索引我需要在确保索引时包含_id:
db.comments.ensureIndex({_id: 1, status : 1, type : 1});
还是会到期?
db.comments.ensureIndex({status : 1, type : 1});
答案 0 :(得分:4)
如果要将其包含在复合索引中,则需要在_id
调用中明确包含ensureIndex
。但是因为_id
的过滤已经提供了单个文档的选择性,这很少是正确的事情。我认为只有当你的文件非常庞大并且你正试图使用covered indexes时才有意义。
答案 1 :(得分:3)
MongoDB目前仅使用one index per query,但$or
查询除外。如果您的常见查询将始终搜索这三个字段(_id,status,type),那么复合索引将会有所帮助。
在DB shell中,您可以在查询中使用explain()命令来获取有关所用索引的信息。
答案 2 :(得分:-2)
您无需在_id字段上隐式创建索引,而是自动完成。请参阅mongo documentation:
_id索引
对于除上限集合之外的所有集合,将自动为_id字段创建索引。此索引是特殊的,无法删除。 _id索引强制其键的唯一性(除了某些带分片的情况)。