Cloud Firestore 通过要求每个查询都有一个索引来确保查询性能。最基本查询所需的索引会自动为您创建。在您使用和测试应用时,Cloud Firestore 会生成错误消息,帮助您创建应用所需的额外索引。本页介绍如何管理您的单字段索引和复合索引。
通过报错信息创建缺失索引
如果您尝试使用未映射到现有索引的范围子句进行复合查询,则会收到错误消息。错误消息包含一个直接链接,用于在 Firebase 控制台中创建缺失的索引。
按照生成的链接访问 Firebase 控制台,查看自动填充的信息,然后单击创建。
使用 Firebase 控制台
要从 Firebase 控制台手动创建新索引:
- 转到Firebase 控制台的Cloud Firestore部分。
- 转到Indexes选项卡并单击Add Index 。
- 输入集合名称并设置要作为索引排序依据的字段。
- 单击创建。
建立索引可能需要几分钟时间,具体取决于查询的大小。创建它们后,您可以在“综合索引”部分查看您的索引及其状态。如果他们仍在构建,Firebase 控制台会包含一个构建状态栏。
删除索引
要删除索引:
- 转到Firebase 控制台的Cloud Firestore部分。
- 单击索引选项卡。
- 将鼠标悬停在要删除的索引上,然后从上下文菜单中选择删除。
- 通过单击警报中的删除确认您要删除它。
使用 Firebase CLI
您还可以使用Firebase CLI部署索引。首先,在您的项目目录中运行firebase init firestore
。在设置过程中,Firebase CLI 会生成一个 JSON 文件,其中包含格式正确的默认索引。编辑该文件以添加更多索引并使用firebase deploy
命令进行部署。如果您只想部署索引,请添加--only firestore:indexes
标志。如果您使用 Firebase 控制台对索引进行编辑,请确保您还更新了本地索引文件。请参阅JSON 索引定义参考。
索引建立时间
要构建索引,Cloud Firestore 必须设置索引,然后使用现有数据回填索引。索引构建时间是设置时间和回填时间的总和:
设置索引需要几分钟时间。索引的最短构建时间为几分钟,即使对于空数据库也是如此。
回填时间取决于多少现有数据属于新索引。与索引定义匹配的字段值越多,回填索引所需的时间就越长。
索引构建是长时间运行的操作。
在您开始构建索引后,Cloud Firestore 会为该操作分配一个唯一的名称。操作名称以projects/[PROJECT_ID]/databases/(default)/operations/
为前缀,例如:
projects/project-id/databases/(default)/operations/ASA1MTAwNDQxNAgadGx1YWZlZAcSeWx0aGdpbi1zYm9qLW5pbWRhEgopEg
但是,您可以在为describe
命令指定操作名称时省略前缀。
列出所有长时间运行的操作
要列出长时间运行的操作,请使用gcloud firestore operations list命令。此命令列出正在进行的和最近完成的操作。操作在完成后列出几天:
gcloud firestore operations list
检查运行状态
您可以列出单个操作的详细信息,而不是列出所有长时间运行的操作:
gcloud firestore operations describe operation-name
估计完成时间
当您的操作运行时,请查看state
字段的值以了解操作的总体状态。
对长时间运行的操作的状态的请求也会返回指标workEstimated
和workCompleted
。这些指标是针对文档数量返回的。 workEstimated
显示操作将处理的估计文档总数。 workCompleted
显示到目前为止已处理的文档数。操作完成后, workCompleted
反映了实际处理的文档总数,这可能与workEstimated
的值不同。
workCompleted
按workEstimated
进行粗略的进度预估。估计可能不准确,因为它依赖于延迟的统计信息收集。
例如,这是索引构建的进度状态:
{ "operations": [ { "name": "projects/project-id/operations/AyAyMDBiM2U5NTgwZDAtZGIyYi0zYjc0LTIzYWEtZjg1ZGdWFmZWQHEjF0c2Flc3UtcmV4ZWRuaS1uaW1kYRUKSBI", "metadata": { "@type": "type.googleapis.com/google.firestore.admin.v1.IndexOperationMetadata", "common": { "operationType": "CREATE_INDEX", "startTime": "2020-06-23T16:52:25.697539Z", "state": "PROCESSING" }, "progressDocuments": { "workCompleted": "219327", "workEstimated": "2198182" } }, }, ...
当操作完成时,操作描述将包含"done": true
。操作结果见state
字段的值。如果响应中未设置done
字段,则其值为false
。不要依赖于正在进行的操作的done
值的存在。
索引构建错误
在管理复合索引和单字段索引豁免时,您可能会遇到索引构建错误。如果 Cloud Firestore 索引的数据遇到问题,索引操作可能会失败。最常见的是,这意味着您达到了索引限制。例如,操作可能已达到每个文档的最大索引条目数。
如果索引创建失败,您会在控制台中看到错误消息。在确认没有达到任何索引限制后,重试索引操作。