索引概览

本部分介绍了 Cloud Firestore 企业版的索引编制功能。Cloud Firestore 企业版默认情况下不会创建任何索引。为了提高数据库性能,请为最常用的查询创建索引。

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

版本之间的区别

下表概述了 Cloud Firestore 标准版和 Cloud Firestore 企业版在索引方面的主要区别。

功能 Cloud Firestore 标准版 Cloud Firestore 企业版
索引编制要求 所有查询都需要索引才能执行。由于此要求,查询通常具有良好的性能。 查询不需要索引。支持对未索引数据进行读取,从而消除了原型设计的障碍。
自动编入索引 默认情况下,系统会自动为文档中的所有字段创建单字段索引。 没有自动索引。您必须手动管理所有索引。
索引密度 默认为稀疏索引。仅当集合组中的文档为每个索引字段都包含值时,该文档才会被编入索引。 默认为非稀疏索引。集合组中的所有文档都会被编入索引。没有值的索引字段会设置为 NULL。您可以使用稀疏索引选项更改此行为。
支持的索引类型和选项
  • 单字段(自动索引)
  • 复合索引
  • 集合或集合组范围
  • Array-contains
  • 向量
  • 集合或集合组范围
  • 非稀疏或稀疏索引密度
  • Array-contains
  • 向量
  • 唯一索引

索引定义和结构

索引包含以下内容:

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

索引还可以启用稀疏唯一选项。

索引排序

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

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

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

索引密度

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

稀疏索引

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

唯一索引

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

唯一索引中缺少字段

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

例如,使用此索引时:

集合 编入索引的字段 查询范围
cities 名称(升序) 集合

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

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

排查索引构建错误

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

  • 已达到索引限制。例如,操作可能已达到每个文档的索引条目数量上限。如果索引创建失败,您会看到一条错误消息。如果未达到索引限制,请重试编入索引操作。
  • 您设置了唯一索引选项,但编入索引的字段的数据会创建重复的索引条目。如需继续,请从数据中移除重复的值组合。

后续步骤

了解如何创建和管理索引