2012-07-03 21 views
2

我正在使用Codeigniter(PHP)和MongoDB构建一个webapp。 我正在创建索引并有一个问题。确保索引时添加_id?

如果我查询的三个字段(_id,状态,类型),并希望 创建一个索引,我需要包括_id确保这样的索引时:

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

还是将因?

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

回答

-2

您不需要在_id字段上隐式创建索引,它会自动完成。见mongo documentation

的_id指数

对所有集合除加盖收集,为_id字段自动创建一个索引。该索引是特殊的,不能删除。 _id索引强制其键的唯一性(除了一些使用分片的情况)。

+1

是的,但是当我创建一个compond索引是不需要的呢? –

+0

@pangabiMC:'_id'字段是真的,如果你只是在_id上查询,这很有用。最初的问题是关于在_id和其他两个字段上搜索查询的复合索引。 @JonathanClark:如果_id是搜索条件的一部分,并且您正在使用复合索引,则您**要包含_id。 – Stennie

+0

是的,我错过了它是一个复合索引,所以我的答案实际上是无用的。如果可以的话,我会删除它... – pangabiMC

3

MongoDB目前仅使用one index per query,但$or查询例外。如果您的常用查询将始终在这三个字段(_id,status,type)上进行搜索,那么复合索引将会很有帮助。

从数据库外壳中,您可以在查询中使用explain()命令获取有关所用索引的信息。

4

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