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 索引的數據遇到問題,索引操作可能會失敗。最常見的是,這意味著您達到了索引限制。例如,操作可能已達到每個文檔的最大索引條目數。
如果索引創建失敗,您會在控制台中看到錯誤消息。在確認沒有達到任何索引限制後,重試索引操作。