建立資料索引

Firebase 可讓您使用任意子鍵對資料執行臨時查詢。如果您事先知道索引的內容,可以透過 Firebase 即時資料庫安全性規則中的 .indexOn 規則定義索引,以改善查詢效能。

定義資料索引

Firebase 提供強大的工具,可用於排序查詢資料。具體來說,Firebase 可讓您使用任何常見的子項鍵,對一組節點執行臨時查詢。隨著應用程式規模擴大,這項查詢的效能也會降低。不過,如果您告知 Firebase 要查詢的鍵,Firebase 就會在伺服器上為這些鍵建立索引,提升查詢效能。

使用 orderByChild 進行索引

最簡單的說明方式就是舉例說明。我們 Firebase 團隊一致認為恐龍很酷。以下是恐龍知識資料庫範例的程式碼片段。我們將使用此範例說明 .indexOn 如何與 orderByChild() 搭配運作。

{
  "lambeosaurus": {
    "height" : 2.1,
    "length" : 12.5,
    "weight": 5000
  },
  "stegosaurus": {
    "height" : 4,
    "length" : 9,
    "weight" : 2500
  }
}

假設在應用程式中,我們經常需要依名稱、高度和長度排序恐龍,但絕不會依重量排序。我們可以將這項資訊告知 Firebase,藉此改善查詢效能。由於恐龍名稱只是金鑰,Firebase 已針對以恐龍名稱為查詢條件的查詢進行最佳化,因為這是記錄的金鑰。我們可以使用 .indexOn 指示 Firebase 針對高度和長度最佳化查詢:

{
  "rules": {
    "dinosaurs": {
      ".indexOn": ["height", "length"]
    }
  }
}

如同其他規則,您可以在規則的任何層級指定 .indexOn 規則。我們在上述範例中將其放在根層級,是因為所有恐龍資料都儲存在資料庫的根層級。

使用 orderByValue 建立索引

在這個範例中,我們將示範 .indexOn 如何與 orderByValue() 搭配運作。假設我們要使用以下資料製作恐龍運動得分排行榜:

{
  "scores": {
    "bruhathkayosaurus" : 55,
    "lambeosaurus" : 21,
    "linhenykus" : 80,
    "pterodactyl" : 93,
    "stegosaurus" : 5,
    "triceratops" : 22
  }
}

由於我們使用 orderByValue() 建立排行榜,因此可以在 /scores 節點中新增 .value 規則,藉此改善查詢:

{
  "rules": {
    "scores": {
      ".indexOn": ".value"
    }
  }
}