索引鍵的熱視圖模式

本頁展示多個 Key Visualizer 熱視圖模式範例,這些模式有助於排解特定效能問題。

用量平均分配

熱視圖顯示均勻分布的讀取與寫入

如果熱視圖顯示暗色與亮色交織的粒狀混合,則代表索引鍵的寫入/刪除作業均勻地分布在整個資料庫當中。這個熱視圖可能代表 Firestore 的使用模式符合效益。

連續鍵的索引

如果熱視圖中只有一條明亮的對角線,表示索引鍵嚴格遞增或遞減,例如時間戳記。不建議使用連續鍵建立索引,因為這可能會產生熱點。發生資源使用率不均時,您可能會發現延遲時間相應增加。

以下列舉一些常見的索引熱點:

時間戳記遞增導致資源使用率不均

熱視圖顯示因時間戳記增加而導致的熱點

在本例中,如果熱視圖上只有一條明亮的對角線,可能表示資料庫在時間戳記欄位名稱上,使用嚴格遞增或遞減的索引寫入/刪除作業。

因欄位名稱增加而導致熱點

熱視圖顯示因欄位增加而出現的熱點

在這個範例中,如果熱視圖上出現一條明亮的對角線,可能表示資料庫在遞增欄位 (例如自動產生的發票號碼) 上,使用嚴格遞增或遞減的索引寫入/刪除作業。

如要找出熱點問題,請使用 Key Visualizer 工具並瞭解索引鍵結構,判斷是哪個索引造成問題,然後根據最佳做法排除這些索引。

瞭解索引鍵結構

瞭解 Key Visualizer 工具中顯示的索引鍵結構之前,請先瞭解 Firestore 中的索引

下列程式碼顯示索引鍵格式範例,將滑鼠游標懸停在熱視圖中受影響的鍵範圍上時,就會看到這個格式。

COLLECTION: projects/PROJECT_ID/databases/(default)/documents/Users
  PROPERTIES: (Timestamp: DESC) 
  VALUES: (16500000000000001)
  DOCUMENT: projects/PROJECT_ID/databases/(default)/documents/Users/5000000000000001

其中:

  • COLLECTION:資料庫中集合的位置。根據範圍,這可以是集合範圍的集合路徑,或是集合群組範圍的集合名稱。
  • PROPERTIES:用於建立索引的欄位。只有在索引定義會修改預設排序時,才會顯示__name__排序屬性
  • VALUES:各屬性的值。
  • DOCUMENT:在作業中更新的文件 ID。

從先前的範例中,找出 PROPERTIES 值中的欄位,以找出受影響的索引。

如要尋找索引,請完成下列步驟:

  1. 前往 Google Cloud 控制台的「Databases」頁面。

    前往「資料庫」

  2. 從資料庫清單中選取所需資料庫。

  3. 在導覽選單中,按一下「索引」

  4. 前往「複合」或「單一欄位」分頁。

    您可以分析 PROPERTIES 欄位,判斷索引類型。詳情請參閱索引鍵範例

  5. 按一下「篩選器」,選取「欄位」,然後輸入欄位名稱。

    如果是複合式索引,請使用 OR 運算子新增更多欄位。

找出造成問題的索引後,您可以採取下列解決方案:

  • 複合索引:修改索引,確保所含資料值只會遞增或遞減的欄位不會選為索引的第一個欄位,或刪除索引。

  • 單一欄位索引:為要豁免的欄位和排序順序新增豁免設定。詳情請參閱「新增單一欄位豁免項目」。

熱視圖上的索引鍵項目範例

類型 說明 範例
集合範圍單一欄位索引 ASC、DESC Firestore 預設會建立設有集合範圍的索引。

Timestamp 欄位單一欄位索引的索引項目,以遞減順序排列 Users/5000000000000001 文件。
COLLECTION: projects/PROJECT_ID/databases/(default)/documents/Users
PROPERTIES: (Timestamp: DESC)
VALUES: (16500000000000001)
DOCUMENT: projects/PROJECT_ID/databases/(default)/documents/Users/5000000000000001
集合範圍的陣列欄位單一欄位索引 針對文件中的每個陣列欄位,Firestore 會建立並維護集合範圍的 array-contains 索引。

當欄位 Country: [USA, Japan] 新增至文件時,系統會建立陣列包含模式的單一欄位索引,並為該索引建立索引項目。請注意,系統也會預設為這個欄位建立 ASC 和 DESC 索引。這個範例顯示 Country 欄位的 ASC 索引。
COLLECTION: projects/PROJECT_ID/databases/(default)/documents/Users
PROPERTIES:(Country: ASC)
VALUES:([USA, Japan]) DOCUMENT:(projects/PROJECT_ID/databases/(default)/documents/Users/5000000000000001)
集合群組單一欄位索引 ASC、DESC、ARRAY 集合群組包含所有集合 ID 相同的集合。
集合群組單一欄位索引的索引項目,依 Timestamp 欄位遞減排序。
COLLECTION GROUP: Users
PROPERTIES: (Timestamp: DESC)
VALUES: (16500000000000001L)
DOCUMENT: projects/PROJECT_ID/databases/(default)/documents/Users/5000000000000001
集合群組單一欄位索引 ASC、DESC、ARRAY array-contains 模式中,集合群組單一欄位索引的索引項目 (位於 Country 欄位) COLLECTION GROUP: Users PROPERTIES: (Country: ARRAY ASC) VALUES: (USA) DOCUMENT: projects/PROJECT_ID/databases/(default)/documents/Users/5000000000000001
集合複合式索引項目,具有 ASC、ASC、ARRAY 屬性 使用集合範圍索引定義建立巢狀文件時,系統會建立含有父項的複合式索引項目。

複合式索引的索引項目,其中 TimestampName 欄位為遞增順序,而 Country 則為 array-contains 模式。
COLLECTION: projects/PROJECT_ID/databases/(default)/documents/Users
PROPERTIES: (Timestamp: ASC, Name: ASC,Country: ARRAY)
VALUES: (16500000000000001L, 'Alice', 'USA')
DOCUMENT: (projects/PROJECT_ID/databases/(default)/documents/Users/5000000000000001)
集合群組範圍複合式索引項目,具有 ASC 和 ASC 屬性 Timestamp 欄位複合式索引的索引項目 (遞增順序),以及 Name 欄位 (遞增順序) COLLECTION GROUP: Users
PROPERTIES: (Timestamp: ASC, Name: ASC)
VALUES: (16500000000000001L, 'Alice')
DOCUMENT: (projects/PROJECT_ID/databases/(default)/documents/Users/5000000000000001)
集合範圍複合式索引項目,具有 ASC 和 __name__ 屬性 複合式索引的索引項目,Timestamp 欄位為遞增排序,Users/5000000000000001 文件為遞減排序。__name__您可以在索引定義中使用 __name__ 做為最後一個欄位,變更結果的預設排序方式 COLLECTION: projects/PROJECT_ID/databases/(default)/documents/Users
PROPERTIES: (Timestamp: ASC, __name__ DESC)
VALUES: (16500000000000001)
DOCUMENT: projects/PROJECT_ID/databases/(default)/documents/Users/5000000000000001

後續步驟