管理索引
Firestore 要求每个查询都要有索引,以确保查询性能。它会自动为您创建最基本的查询所需的索引。在您使用并测试应用时,Cloud Firestore 会生成错误消息,以帮助您创建应用所需的其他索引。本页面介绍如何管理单字段索引和复合索引。
通过错误消息创建缺失的索引
如果您尝试使用未映射到现有索引的范围子句进行复合查询,则会收到错误。错误消息中包含一个直接链接,用于在 Firebase 控制台中创建缺失的索引。
通过生成的链接转到 Firebase 控制台,查看自动填充的信息,然后点击创建。
使用 Google Cloud Platform Console
在 Google Cloud Platform Console 中,您可以管理单字段索引例外项和复合索引。
创建复合索引
要在 GCP Console 中手动创建新的复合索引,请执行以下操作:
转到复合索引部分。
点击创建索引。
输入集合 ID。添加要编入索引的字段名称和每个字段的索引模式。 点击保存索引。
您的新索引将显示在复合索引列表中,并且 Firestore 将开始创建索引。索引创建完成后,您会在索引旁边看到一个绿色对勾标记。
删除复合索引
要删除复合索引,请执行以下操作:
转到复合索引部分。
在复合索引列表中,点击要删除的索引的更多按钮
。点击删除。通过点击提醒中的删除索引,确认您要删除此索引。
添加单字段索引例外项
您可以使用单字段索引例外项来替换集合中特定字段的自动索引设置。您可以从控制台添加单字段例外项:
转到单字段索引部分。
点击添加豁免项。
输入集合 ID 和字段路径。
为此字段选择新的索引设置。为此字段启用或停用自动更新的升序、降序和数组包含的单字段索引。
点击保存豁免。
删除单字段索引例外项
如需删除单字段索引例外项,请执行以下操作:
在 Firestore 查看器中,转到单字段索引部分。
在单字段索引例外项列表中,点击要删除的例外项的更多按钮
。点击删除。点击提醒中的删除,确认您要删除此豁免项。
当您删除单字段例外项时,指定的字段或子字段将使用继承的索引设置。文档字段将还原为数据库的自动索引设置。映射中的子字段在继承自动索引设置之前会继承父字段的所有例外项。
使用 Firebase CLI
您还可以使用 Firebase CLI 部署索引。如需开始使用,请在您的项目目录中运行 firebase init firestore
。在设置过程中,Firebase CLI 会以正确的格式生成一个包含默认索引的 JSON 文件。修改该文件以添加更多索引,并使用 firebase deploy
命令部署该文件。如果您只想部署索引,请添加 --only firestore:indexes
标志。如果您使用 Firebase 控制台对索引进行了修改,请务必同时更新本地索引文件。请参阅 JSON 索引定义参考。
索引构建时间
如需构建索引,Firestore 必须设置索引,然后使用现有数据回填索引。索引构建时间是设置时间和回填时间的总和:
设置索引需要几分钟时间。索引的最短构建时间为几分钟,即使空数据库也是如此。
回填时间取决于属于新索引的现有数据的数量。与索引定义匹配的字段值越多,回填索引所需的时间就越长。
索引构建是长时间运行的操作。
在您启动索引构建后,Firestore 会为操作分配唯一的名称。操作名称的前缀为 projects/[PROJECT_ID]/databases/(default)/operations/
,例如:
projects/project-id/databases/(default)/operations/ASA1MTAwNDQxNAgadGx1YWZlZAcSeWx0aGdpbi1zYm9qLW5pbWRhEgopEg
不过,您可以在指定 describe
命令的操作名称时省略前缀。
列出所有长时间运行的操作
如需列出长时间运行的操作,请使用 gcloud firestore actions 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
值的存在。
索引构建错误
管理复合索引和单字段索引例外项时,您可能会遇到索引构建错误。如果 Firestore 的数据编入索引时出现问题,则索引操作可能会失败。通常这表示您达到了索引限制。例如,操作可能已达到每个文档的索引条目数量上限。
如果索引创建失败,您会在控制台中看到错误消息。确认您没有达到任何索引限制后,请重新尝试您的索引操作。