優化數據庫性能

有幾種不同的方法可以提高應用程式中的 Firebase 即時資料庫效能。要了解可以採取哪些措施來優化即時資料庫效能,請透過不同的即時資料庫監控工具收集數據,然後對您的應用程式或即時資料庫使用進行相應的變更。

監控即時資料庫效能

您可以透過幾種不同的工具收集有關即時資料庫效能的數據,具體取決於您需要的粒度等級:

  • 進階概述:使用探查器工具取得未索引查詢的清單以及讀取/寫入操作的即時概述。
  • 計費使用量估算:使用Firebase 控制台中提供的使用量指標來查看您的計費使用量和進階效能指標。
  • 詳細的深入分析:使用Cloud Monitoring更詳細地了解資料庫隨時間的運作。

透過指標提高性能

收集資料後,請根據您想要改進的效能領域探索以下最佳實踐和策略。

績效改善策略概覽
公制描述最佳實踐
負載/利用率優化在任何給定時間處理請求時使用的資料庫容量有多少(反映在 **Load** 或​​ **io/database_load** 指標中)。優化您的資料結構
跨資料庫分片數據
提高聽眾效率
使用基於查詢的規則限制下載
優化連接
活躍連線數平衡資料庫的並發活動連線數,使其保持在 200,000 個連線限制以下。跨資料庫分片數據
減少新連接
傳出頻寬如果資料庫的下載量看起來比您想要的要高,您可以提高讀取操作的效率並減少加密開銷。優化連接
優化您的資料結構
使用基於查詢的規則限制下載
重複使用 SSL 會話
提高聽眾效率
限制對數據的訪問
貯存確保您沒有儲存未使用的數據,或在其他資料庫和/或 Firebase 產品之間平衡儲存的資料以保持在配額以內。清理未使用的數據
優化您的資料結構
跨資料庫分片數據
使用 Firebase 雲端存儲

優化連接

GETPUT等 RESTful 請求仍然需要連接,即使該連接是短暫的。與資料庫的即時活動連線相比,這些頻繁、短暫的連線實際上會增加更多的連線成本、資料庫負載和傳出頻寬。

只要有可能,請使用適用於您的應用程式平台的本機 SDK,而不是 REST API。 SDK 保持開放連接,從而降低了 REST API 可能增加的 SSL 加密成本和資料庫負載。

如果您確實使用 REST API,請考慮使用 HTTP keep-alive 來維持開放連線或使用伺服器發送的事件,這可以降低 SSL 握手的成本。

跨多個資料庫分片數據

將資料拆分到多個即時資料庫執行個體(也稱為資料庫分片)可帶來三個好處:

  1. 透過將連線拆分到資料庫實例上,增加應用程式上允許的並發活動連線總數。
  2. 平衡資料庫執行個體之間的負載。
  3. 如果您擁有僅需要存取離散資料集的獨立使用者群組,請使用不同的資料庫實例以獲得更高的吞吐量和更低的延遲。

如果您採用Blaze 定價計劃,則可以在相同 Firebase 專案中建立多個資料庫實例,並利用跨資料庫實例的通用使用者驗證方法。

詳細了解如何以及何時對資料進行分片

建構高效的資料結構

由於即時資料庫從路徑的子節點以及路徑中檢索數據,因此保持資料結構盡可能平坦是有意義的。這樣,您就可以選擇性地檢索所需的數據,而無需將不必要的數據下載到客戶端。

特別是,在建立資料時要考慮寫入和刪除。例如,刪除具有數千個葉子的路徑的成本可能很高。將它們分成具有多個子樹和每個節點較少葉子的路徑可以加快刪除速度。

此外,每次寫入可能會佔用資料庫總使用率的 0.1%。以允許您透過 SDK 中的update()方法或 RESTful PATCH請求將多路徑更新批次寫入單一操作的方式建構資料。

要優化資料結構並提高效能,請遵循資料結構的最佳實務

防止未經授權的訪問

使用即時資料庫安全規則防止對資料庫進行未經授權的操作。例如,使用規則可以避免惡意使用者重複下載整個資料庫的情況。

詳細了解如何使用 Firebase 即時資料庫規則

使用基於查詢的規則來限制下載

即時資料庫安全規則限制對資料庫中資料的訪問​​,但它們也可以限制透過讀取操作返回的資料。當您使用基於查詢的規則時,如query.query.limitToFirst這樣的表達式,查詢僅檢索規則範圍內的資料。

例如,以下規則限制僅對查詢的前 1000 個結果進行讀取存取(按優先順序排序):

messages: {
  ".read": "query.orderByKey &&
            query.limitToFirst <= 1000"
}

// Example query:
db.ref("messages").limitToFirst(1000)
                  .orderByKey("value")

了解有關即時資料庫安全規則的更多資訊。

索引查詢

對資料建立索引可以減少應用程式執行的每個查詢所使用的總頻寬。

重複使用 SSL 會話

透過頒發TLS 會話票證,減少恢復連線時的 SSL 加密開銷。如果您確實需要頻繁、安全地連接到資料庫,這尤其有用。

提高聽眾效率

將聽眾放置在盡可能遠的位置,以限制他們同步的資料量。您的聽眾應該接近您希望他們獲得的數據。不要在資料庫根目錄監聽,因為這會導致下載整個資料庫。

新增查詢以限制偵聽操作傳回的數據,並使用僅下載資料更新的偵聽器 - 例如, on()而不是once() 。為真正不需要資料更新的操作保留.once() 。此外,盡可能使用orderByKey()對查詢進行排序,以獲得最佳效能。使用orderByChild()排序可能會慢 6-8 倍,而對於大型資料集,使用orderByValue()排序可能會非常慢,因為它需要從持久層讀取整個位置。

確保也會動態新增偵聽器,並在不再需要時將其刪除。

清理未使用的數據

定期刪除資料庫中任何未使用或重複的資料。您可以執行備份來手動檢查資料或定期將其備份到 Google Cloud Storage 儲存桶。請同時考慮透過Cloud Storage for Firebase託管儲存的資料。

發布可更新的可擴展程式碼

物聯網設備中內建的應用程式應包含可輕鬆更新的可擴充程式碼。確保徹底測試用例,考慮用戶群可能呈指數級增長的場景,並建立將更新部署到程式碼的能力。仔細考慮您可能需要進行的重大更改,例如,如果您決定對資料進行分片。