MongoDB 索引

MongoDB 索引

在 MongoDB 中设置索引,主要是为了增加查询效率;

没有设置索引,MongoDB 在查询数据的时候执行的是:扫描整个集合 Collection,在数据量不大的时候没有问题,一旦数据量增加到一定程度后,查询耗时就会很高,导致查询效率变低。

简单索引

1
2
3
4
5
6
7
8
9
# 1. 方法
createIndex()

# 2. 样例(单字段索引)
db.collection.createIndex(keys, options)
testdb.student.createIndex({"code":1})

# 3. 设置使用多个字段创建索引(关系型数据库中称作:联合索引)
db.col.createIndex({"id":1,"code":-1})

在嵌入字段上创建索引img

您可以对嵌入文档中的字段创建索引,就像可以为文档中的顶级字段编制索引一样。嵌入字段上的索引不同于嵌入文档上的索引,后者包括索引中嵌入文档的最大索引大小的完整内容。相反,嵌入字段上的索引允许您使用“点表示法”来自省嵌入的文档。

请考虑一个名为 的集合,该集合保存类似于以下示例文档的文档:records

1
2
3
4
5
{
"_id": ObjectId("570c04a4ad233577f97dc459"),
"score": 1034,
"location": { state: "NY", city: "New York" }
}

以下操作将在字段上创建索引:location.state

1
db.records.createIndex( { "location.state": 1 } )

创建的索引将支持在字段上选择的查询,如下所示:location.state

1
2
db.records.find( { "location.state": "CA" } )
db.records.find( { "location.city": "Albany", "location.state": "NY" } )

在嵌入文档上创建索引img

还可以在整个嵌入文档上创建索引。

请考虑一个名为 record 的集合,该集合保存类似于以下示例文档的文档:records

1
2
3
4
5
{
"_id": ObjectId("570c04a4ad233577f97dc459"),
"score": 1034,
"location": { state: "NY", city: "New York" }
}

该字段是嵌入的文档,包含嵌入的字段和 。以下命令在整个字段上创建索引:location city state location

1
db.records.createIndex( { location: 1 } )

以下查询可以使用字段上的索引:location

1
db.records.find( { location: { city: "New York", state: "NY" } } )

注意

尽管查询可以使用索引,但结果集不包括上面的示例文档。对嵌入的文档执行相等匹配时,字段顺序很重要,嵌入的文档必须完全匹配。有关查询嵌入文档的详细信息,请参阅查询嵌入文档。

其他注意事项img

在索引生成期间,应用程序可能会遇到性能降低的问题,包括对集合的有限读/写访问权限。有关索引生成过程的详细信息,请参阅填充集合上的索引生成,包括复制环境中的索引生成部分。

某些驱动程序可能指定索引,使用而不是用作规范。这对生成的索引没有任何影响。NumberLong(1)``1

高级索引