索引總覽

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

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

索引定義和結構

索引包含下列項目:

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

索引也可以啟用「稀疏」、「多鍵」或「不重複」選項。

索引排序

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

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

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

索引密度

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

稀疏索引

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

陣列值的多重金鑰索引

如要為含有陣列值的欄位建立索引,請務必建立多重金鑰索引。一般索引無法為陣列值建立索引。多重金鑰索引在索引定義中最多支援一個陣列欄位,可用於遍歷陣列值的作業。

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

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

  • 作業嘗試將陣列值新增至由一般索引建立索引的欄位。如要新增陣列值,您必須刪除該欄位現有的常規索引,並將其重新建立為多鍵索引。
  • 您嘗試在包含陣列值的欄位上建立一般索引。您必須建立多重鍵索引,或刪除陣列值。
  • 某項作業嘗試為多個含有陣列值的欄位建立索引。多重鍵索引中,最多只能有一個欄位含有陣列值。如要繼續,請修改資料模型或索引定義。
  • 您嘗試建立多鍵索引,但兩個欄位路徑共用常見前置字元,例如 users.posts 和 users.zip。

不重複的查詢

設定不重複索引選項,強制為已建立索引的欄位設定不重複值。 如果是多個欄位的索引,每個值組合在索引中都不得重複。資料庫會拒絕任何嘗試建立重複值索引項目的更新和插入作業。如果已建立索引的欄位資料含有重複值,且您嘗試建立不重複的索引,索引建構作業就會失敗,並在作業詳細資料中顯示錯誤訊息。

不重複索引中缺少的欄位

如果您插入的文件缺少不重複索引的欄位,索引會為缺少的欄位設定 null 值。產生的索引項目必須是唯一的,否則作業會失敗。

舉例來說,使用這個索引:

db.cities.createIndex( { "name": 1 }, { unique: true } )

如果將文件 {"abbreviation": "LA"} 新增至集合,不重複索引會建立一個項目,並將 name 設為 null。如果您嘗試新增文件 {"abbreviation": "NYC"},作業會失敗,因為產生的唯一索引項目相同。

多個欄位的不重複索引也適用相同行為。 建立或更新文件時,缺少的索引欄位會設為 null,且產生的索引項目在索引中必須是唯一的。

陣列值的不重複索引

您可以使用不重複的多鍵索引,確保文件沒有重疊的陣列元素。

這類索引不會強制確保單一文件中的陣列值不重複。

例如,使用不重複索引:

db.collection.createIndex( { "tags": 1 }, { unique: true } )

可插入的文件如下:

{
  "_id": 1,
  "tags": [ "news", "tech", "news", "music" ]
}

索引允許單一文件中相同陣列內的值重複 ("news")。

如果嘗試插入含有重複元素的第二份文件,作業就會失敗:

{
  "_id": 2,
  "tags": [ "sports", "music" ]
}

由於 "music" 已存在於文件 1 的陣列中,並對應至索引,因此作業失敗。

如要確保單一文件中同一陣列內的元素是唯一的,請在應用程式邏輯中處理這項作業,方法是使用 $addToSet 等更新運算子,而非 $push。

空陣列、缺少欄位和空值

一般來說,不重複索引中缺少的欄位會視為 null,且在所有文件中不得重複 (請參閱「不重複索引中缺少的欄位」)。不過,如果是陣列欄位的專屬索引:

  • 空白陣列、遺漏欄位和獨立空值:如果陣列欄位空白、完全遺漏或包含獨立 null 值 (不在陣列內),系統就不會為文件產生索引鍵。因此,多個文件可以有空白欄位或獨立 null 值,而不會觸發重複鍵錯誤。
  • 陣列中的空值元素:如果陣列包含 null 值做為元素 (例如 ["news", null]),系統會為 null 元素建立索引。如果後續文件在索引陣列欄位中包含 null 元素,就會發生重複鍵錯誤。

存留時間索引

使用存留時間 (TTL) 索引,自動移除資料庫中的過時資料。存留時間索引會將指定欄位設為指定集合中文件的到期時間。您可以運用存留時間清除過時資料,降低儲存費用。通常會在到期時間後的 24 小時內刪除資料。

排解索引建立錯誤

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

  • 您已達到索引上限。舉例來說,作業可能已達到每個文件的索引項目數量上限。如果索引建立失敗,您會看到錯誤訊息。如果未達索引上限,請重試索引作業。
  • 必須提供多重鍵索引。至少有一個已建立索引的欄位包含陣列值。如要繼續,您必須使用多重鍵索引或刪除陣列值。
  • 作業嘗試為多個含有陣列值的欄位建立索引。多重鍵索引中,最多只能有一個欄位含有陣列值。如要繼續,請修改資料模型或索引定義。
  • 您設定了不重複索引選項,而索引欄位的資料會建立重複的索引項目。如要繼續,請從資料中移除重複的值組合。

後續步驟