在 Cloud Firestore 中管理索引

Cloud Firestore 通過為每個查詢都需要一個索引來確保查詢性能。系統會自動為您創建最基本查詢所需的索引。在您使用和測試應用時,Cloud Firestore 會生成錯誤消息,幫助您創建應用所需的額外索引。本頁介紹如何管理單字段索引和復合索引。

通過錯誤消息創建缺失索引

如果您嘗試使用未映射到現有索引的範圍子句進行複合查詢,則會收到錯誤消息。錯誤消息包含在 Firebase 控制台中創建缺失索引的直接鏈接。

按照生成的指向 Firebase 控制台的鏈接,查看自動填充的信息,然後單擊Create

使用 Firebase 控制台

要從 Firebase 控制台手動創建新索引:

Firebase 控制台中的 Firestore 索引界面的圖像

  1. 轉到Firebase 控制台Cloud Firestore部分。
  2. 轉到索引選項卡並單擊添加索引
  3. 輸入集合名稱並設置您要為索引排序的字段。
  4. 單擊創建

建立索引可能需要幾分鐘時間,具體取決於查詢的大小。創建它們後,您可以在綜合索引部分查看您的索引及其狀態。如果他們仍在構建,Firebase 控制台會包含一個構建狀態欄。

刪除索引

要刪除索引:

  1. 轉到Firebase 控制台Cloud Firestore部分。
  2. 單擊索引選項卡。
  3. 將鼠標懸停在要刪除的索引上,然後從上下文菜單中選擇刪除
  4. 通過單擊警報中的刪除來確認您要刪除它。

使用 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字段的值以了解操作的整體狀態。

對長時間運行操作狀態的請求還會返回指標workEstimatedworkCompleted 。這些指標是針對文檔數量返回的。 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 的索引數據遇到問題,索引操作可能會失敗。最常見的是,這意味著您達到了索引限制。例如,該操作可能已達到每個文檔的最大索引條目數。

如果索引創建失敗,您會在控制台中看到錯誤消息。在您確認您沒有達到任何索引限制後,請重試您的索引操作。