索引概览
本页介绍了与 MongoDB 兼容的 Firestore 的索引编制。 默认情况下,与 MongoDB 兼容的 Firestore 不会创建任何索引。为了提高数据库性能,请为最常用的查询创建索引。
索引对数据库的性能有很大影响。如果查询存在索引,数据库可以通过减少需要扫描的数据量和对结果进行排序所需的工作量,高效地返回结果。不过,索引条目会增加存储费用,并增加在对编入索引的字段执行写入操作期间完成的工作量。
索引定义和结构
索引包含以下内容:
- 集合 ID
- 给定集合中的字段列表
- 每个字段的顺序(升序或降序)
索引排序
每个字段的顺序和排序方向用于唯一定义索引。例如,以下两个索引是不同的索引,不能互换:
集合 | 字段 |
---|---|
cities | 国家/地区(升序)、人口(降序) |
cities | 人口(降序)、国家/地区(升序) |
创建用于支持查询的索引时,请按与查询相同的顺序添加字段。
索引密度
默认情况下,索引条目会存储集合中所有文档的数据。这称为非稀疏索引。无论文档是否包含索引中指定的任何字段,系统都会为该文档添加索引条目。在生成索引条目时,不存在的字段会被视为具有 NULL 值。如需更改此行为,您可以将索引定义为稀疏索引。
稀疏索引
稀疏索引只会将集合中至少有一个被编入索引字段包含值(包括 null)的文档编入索引。稀疏索引可降低存储费用并提高性能。
数组值的多键索引
如果您要在包含数组值的字段上创建索引,则必须创建多键索引。常规索引无法将数组值编入索引。多键索引在索引定义中最多支持一个数组字段,可用于遍历数组值的操作。
仅当您知道需要将数组值编入索引时,才使用多键索引。在处理查询时,常规索引具有优势。例如,常规索引可以更高效地过滤某个范围内的值。
在使用数组值和多键索引时,以下情况会导致错误:
- 某项操作尝试向由常规索引编入索引的字段添加数组值。如需添加数组值,您必须删除该字段上的现有常规索引,然后将其重新创建为多键索引。
- 您尝试在包含数组值的字段上创建常规索引。您必须创建多键索引或删除数组值。
- 某项操作尝试将具有数组值的多个字段编入索引。在多键索引中,不能有多个具有数组值的字段。如需继续,请修改数据模型或索引定义。
- 您尝试创建多键索引,其中两个字段路径共用一个前缀,例如
users.posts
和users.zip
。
唯一索引
设置唯一索引选项,可强制确保编入索引的字段值是唯一的。对于多个字段上的索引,每个值组合在索引中都必须是唯一的。数据库会拒绝任何尝试创建具有重复值的索引条目的更新和插入操作。如果编入索引的字段的数据包含重复值,并且您尝试创建唯一索引,则索引构建会失败,并在操作详细信息中显示错误消息。
唯一索引中缺少字段
如果您插入的文档缺少唯一索引所需的字段,该索引会为这些缺少的字段设置 null
值。生成的索引条目必须是唯一的,否则操作会失败。
例如,使用此索引时:
db.cities.createIndex( { "name": 1 }, { unique: true } )
如果您将文档 {"abbreviation": "LA"}
添加到集合中,唯一索引会创建一个条目,并将 name
设置为 null
。如果您随后尝试添加文档 {"abbreviation": "NYC"}
,则操作会失败,因为生成的唯一索引条目是相同的。
相同的行为适用于包含多个字段的唯一索引。创建或更新文档时,缺少的已编入索引的字段会设置为 null
,并且生成的索引条目在索引中必须是唯一的。
排查索引构建错误
在管理索引时,您可能会遇到索引构建错误。如果数据库遇到数据问题,编入索引操作可能会失败。编入索引操作可能会由于以下原因而失败:
- 已达到索引限制。例如,操作可能已达到每个文档的索引条目数量上限。如果索引创建失败,您会看到一条错误消息。如果未达到索引限制,请重试编入索引操作。
- 必须使用多键索引。至少有一个编入索引的字段包含数组值。如需继续,您必须使用多键索引或删除数组值。
- 某项操作尝试将具有数组值的多个字段编入索引。在多键索引中,不能有多个具有数组值的字段。如需继续,请修改数据模型或索引定义。
- 您设置了唯一索引选项,但编入索引的字段的数据会创建重复的索引条目。如需继续,请从数据中移除重复的值组合。
后续步骤
- 了解如何创建和管理索引