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