索引總覽

本頁面說明與 MongoDB 相容的 Firestore 索引。 與 MongoDB 相容的 Firestore 預設不會建立任何索引。如要提升資料庫效能,請為最常使用的查詢建立索引。

索引對資料庫效能有極大影響。如果查詢有索引,資料庫就能減少需要掃描的資料量,並減少排序結果所需的工作,有效率地傳回結果。不過,索引項目會增加儲存成本,以及在索引欄位上執行寫入作業時的工作量。

索引定義和結構

索引包含下列項目:

  • 集合 ID
  • 指定集合中的欄位清單
  • 每個欄位的排序方式 (遞增或遞減)

索引也可以啟用 sparsemultikey 選項。

索引排序

每個欄位的順序和排序方向會定義索引。舉例來說,下列兩個索引是不同的索引,無法互換:

集合 欄位
cities 國家/地區 (遞增)、人口 (遞減)
cities 人口數 (遞減)、國家/地區 (遞增)

建立索引來支援查詢時,請按照查詢中的欄位順序加入欄位。

索引密度

根據預設,索引項目會儲存集合中所有文件的資料。這稱為非稀疏索引。無論文件是否包含索引中指定的任何欄位,系統都會為文件新增索引項目。產生索引項目時,系統會將不存在的欄位視為具有 NULL 值。如要變更這項行為,您可以將索引定義為稀疏索引。

稀疏索引

稀疏索引只會為集合中符合以下條件的文件建立索引:在至少一個已建立索引欄位包含一個值 (包括空值在內)。稀疏索引可降低儲存費用,並提升效能。

陣列值的多重金鑰索引

如果您要為包含陣列值的欄位建立索引,就必須建立多重鍵索引。一般索引無法為陣列值建立索引。多重鍵索引在索引定義中最多支援一個陣列欄位,可用於遍歷陣列值的作業。

只有在需要將陣列值編入索引時,才使用多重金鑰索引。 處理查詢時,一般索引具有優勢。舉例來說,一般索引可以更有效率地篩選範圍內的值。

使用陣列值和多鍵索引時,下列情況會導致錯誤:

  • 作業嘗試將陣列值新增至由一般索引編入索引的欄位。如要新增陣列值,您必須刪除該欄位現有的正規索引,然後重新建立為多鍵索引。
  • 您嘗試在含有陣列值的欄位上建立一般索引。您必須建立多重金鑰索引或刪除陣列值。
  • 作業嘗試為多個具有陣列值的欄位建立索引。在多鍵索引中,您無法有多個具有陣列值的欄位。如要繼續,請修改資料模型或索引定義。
  • 您嘗試建立多鍵索引,但兩個欄位路徑共用相同的前置字元,例如 users.postsusers.zip

排解索引建構錯誤

管理索引時,可能會遇到索引建構錯誤。如果資料庫發生資料問題,索引作業可能會失敗。索引作業可能會因下列原因而失敗:

  • 您已達到索引上限。舉例來說,作業可能已達到每份文件的索引項目數量上限。如果索引建立失敗,系統會顯示錯誤訊息。如果尚未達到索引上限,請重試索引作業。
  • 必須使用多鍵索引。至少一個已建立索引的欄位包含陣列值。如要繼續,您必須使用多重鍵索引或刪除陣列值。
  • 作業嘗試為多個具有陣列值的欄位建立索引。在多鍵索引中,您無法有多個具有陣列值的欄位。如要繼續,請修改資料模型或索引定義。

後續步驟