索引概览

仅与 Cloud Firestore 企业版相关。

本页介绍了与 MongoDB 兼容的 Cloud Firestore 的索引编制。 默认情况下,与 MongoDB 兼容的 Cloud Firestore 不会创建任何索引。为了提高数据库性能,请为最常用的查询创建索引。

索引对数据库的性能有很大影响。如果查询存在索引,数据库可以通过减少需要扫描的数据量和对结果进行排序所需的工作量,高效地返回结果。不过,索引条目会增加存储费用,并增加在对编入索引的字段执行写入操作期间完成的工作量。

索引定义和结构

索引包含以下内容:

  • 集合 ID
  • 指定集合中的字段列表
  • 每个字段的排序顺序(升序或降序)

索引还可以启用 sparsemultikeyunique 选项。

索引排序

每个字段的顺序和排序方向可唯一确定索引。例如,以下两个索引是不同的索引,不能互换:

集合 字段
cities 国家/地区(升序)、人口(降序)
cities 人口(降序)、国家/地区(升序)、

创建用于支持查询的索引时,请按与查询相同的顺序添加字段。

索引密度

默认情况下,索引条目会存储集合中所有文档的数据。这称为非稀疏索引。无论文档是否包含索引中指定的任何字段,系统都会为该文档添加索引条目。在生成索引条目时,不存在的字段会被视为具有 NULL 值。如需更改此行为,您可以将索引定义为稀疏索引。

稀疏索引

稀疏索引只会为集合中至少有一个被索引字段包含值(包括 null)的文档编制索引。稀疏索引可降低存储费用并提高性能。

针对数组值的多键索引

如果您要为包含数组值的字段创建索引,则必须创建多键索引。常规索引无法将数组值编入索引。多键索引在索引定义中最多支持一个数组字段,可用于遍历数组值的操作。

仅当您知道需要将数组值编入索引时,才使用多键索引。 在处理查询时,常规索引具有优势。例如,常规索引可以更高效地过滤某个范围内的值。

在处理数组值和多键索引时,以下情况会导致错误:

  • 某项操作尝试向由常规索引编入索引的字段添加数组值。如需添加数组值,您必须删除相应字段上的现有常规索引,然后将其重新创建为多键索引。
  • 您尝试在包含数组值的字段上创建常规索引。您必须创建多键索引或删除数组值。
  • 某项操作尝试为具有数组值的多个字段编制索引。在多键索引中,您不能有多个具有数组值的字段。 如需继续,请修改数据模型或索引定义。
  • 您尝试创建多键索引,其中两个字段路径共享一个共同的前缀,例如 users.postsusers.zip

唯一索引

设置唯一索引选项,以强制确保编入索引的字段值是唯一的。 对于多个字段的索引,每个值组合在索引中都必须是唯一的。数据库会拒绝任何尝试创建具有重复值的索引条目的更新和插入操作。如果已编入索引的字段的数据包含重复值,并且您尝试创建唯一索引,则索引构建会失败,并在操作详细信息中显示错误消息。

唯一索引中缺少的字段

如果您插入的文档缺少唯一索引所需的字段,索引会为这些缺失的字段设置 null 值。生成的索引条目必须是唯一的,否则操作会失败。

例如,使用以下索引:

db.cities.createIndex( { "name": 1 }, { unique: true } )

如果您将文档 {"abbreviation": "LA"} 添加到集合中,唯一索引会创建一个条目,并将 name 设置为 null。如果您随后尝试添加文档 {"abbreviation": "NYC"},则操作会失败,因为唯一索引的最终条目是相同的。

对于包含多个字段的唯一索引,也存在同样的行为。 创建或更新文档时,缺少的已编入索引的字段会设置为 null,并且生成的索引条目在索引中必须是唯一的。

排查索引构建错误

在管理索引时,您可能会遇到索引构建错误。如果数据库遇到数据问题,索引操作可能会失败。以下原因可能会导致索引编制操作失败:

  • 您已达到索引上限。例如,操作可能已达到每个文档的索引条目数量上限。如果索引创建失败,您会看到一条错误消息。如果您未达到索引限制,请重试索引操作。
  • 必须使用多键索引。至少有一个被索引的字段包含数组值。如需继续,您必须使用多键索引或删除数组值。
  • 某项操作尝试为具有数组值的多个字段编制索引。在多键索引中,您不能有多个具有数组值的字段。 如需继续,请修改数据模型或索引定义。
  • 您设置了唯一索引选项,但被编入索引的字段的数据会创建重复的索引条目。如需继续,请从数据中移除重复的值组合。

后续步骤