我正在使用Codeigniter(PHP)和MongoDB构建一个Web应用程序。我正在创建索引,有一个问题。如果我查询三个字段(_id,status,type)并希望创建一个索引,那么在确保索引时是否需要包括_id:
db.comments.ensureIndex({_id: 1, status : 1, type : 1});
还是这个到期了
db.comments.ensureIndex({status : 1, type : 1});
6ljaweal1#
如果要将_id包含在复合索引中,则需要在ensureIndex调用中显式包含_id。但是由于_id过滤已经提供了对单个文档的选择性,所以很少有正确的做法。我认为只有在文档非常大并且试图使用覆盖索引的情况下才有意义。
_id
ensureIndex
svmlkihl2#
MongoDB目前每个查询只使用一个索引,$or查询除外。如果您的常见查询总是在这三个字段(_id,status,type)上搜索,那么复合索引会很有帮助。在DBshell中,可以对查询使用explain()命令来获取所用索引的信息。
$or
tyu7yeag3#
_id是唯一的,默认情况下,索引是在_id字段上创建的。由于_id是唯一的,如果查询包含“_id”作为单个文档中的结果,则您永远不需要查询多个字段。From:MongoDB documentationDefault _id Index MongoDB在创建集合时在_id字段上创建一个唯一索引。_id索引防止客户端插入两个_id字段值相同的文档。不能删除_id字段上的此索引。
moiiocjp4#
你不需要隐式地在_id字段上创建索引,它是自动完成的。参见mongo documentation:_id索引对于除capped集合之外的所有集合,将自动为_id字段创建索引。此索引是特殊的,无法删除。_id索引强制其键的唯一性(除了使用分片的某些情况)。
4条答案
按热度按时间6ljaweal1#
如果要将
_id
包含在复合索引中,则需要在ensureIndex
调用中显式包含_id
。但是由于_id
过滤已经提供了对单个文档的选择性,所以很少有正确的做法。我认为只有在文档非常大并且试图使用覆盖索引的情况下才有意义。svmlkihl2#
MongoDB目前每个查询只使用一个索引,
$or
查询除外。如果您的常见查询总是在这三个字段(_id,status,type)上搜索,那么复合索引会很有帮助。在DBshell中,可以对查询使用explain()命令来获取所用索引的信息。
tyu7yeag3#
_id是唯一的,默认情况下,索引是在_id字段上创建的。由于_id是唯一的,如果查询包含“_id”作为单个文档中的结果,则您永远不需要查询多个字段。
From:MongoDB documentation
Default _id Index MongoDB在创建集合时在_id字段上创建一个唯一索引。_id索引防止客户端插入两个_id字段值相同的文档。不能删除_id字段上的此索引。
moiiocjp4#
你不需要隐式地在_id字段上创建索引,它是自动完成的。参见mongo documentation:
_id索引
对于除capped集合之外的所有集合,将自动为_id字段创建索引。此索引是特殊的,无法删除。_id索引强制其键的唯一性(除了使用分片的某些情况)。