分享到

簡介

如果您的應用程式速度變慢,很可能問題至少部分與您的資料庫有關。

了解應用程式的效能問題可能與資料庫有關,是減少延遲的第一步。棘手的部分是要找出這些瓶頸可能存在於何處原因

本文涵蓋一些在資料庫中造成效能瓶頸的最常見問題,以及可以採取的一些補救措施。

資料庫日誌與指標

如果不查看日誌,就不可能診斷出資料庫中的瓶頸。大多數雲端供應商都會提供豐富的資訊,供您評估查詢的狀況,但可能難以理解這些資訊的含義。

探索日誌、指標和查詢統計資訊

大多數雲端資料庫供應商,包括 DigitalOcean、AWS、Google Cloud Platform、MongoDB Atlas 等,都提供一個位置來查看日誌。熟悉此日誌資訊的版面配置和結構非常重要,這樣您才能在稍後更輕鬆地找到問題。

例如,DigitalOcean 提供一個稱為「日誌與查詢」的標籤頁,可直接從部署管理選單存取。

DigitalOcean Logs & Queries Menu Item

在本節中,有一個稱為「近期日誌」的子章節,其中提供日誌資訊的即時顯示。

DigitalOcean Recent Logs section

這些日誌中包含的資訊可能對您嘗試疑難排解的特定瓶頸問題有用,也可能沒用。但是,某些資訊,例如會話持續時間,可能會指示長時間連線到資料庫的會話。

探索指標儀表板

雲端資料庫供應商的指標儀表板可讓您深入了解可能遇到的瓶頸。大多數雲端供應商都會顯示與效能相關的資訊,例如

  • 系統和程序 CPU 使用率
  • 快取使用率
  • 記憶體
  • 連線數

查看系統 CPU 使用率等項目的指標可能會揭示與資源限制相關的問題。您可能會看到與管理任務(例如執行備份)相關的使用率高峰。持續的高使用率可能表示您的資料庫伺服器配置不足。

探索查詢統計資訊

雲端資料庫供應商提供的查詢統計報告可能是判斷效能降低原因的最佳資訊來源。在許多情況下,效能降低可以追溯到執行時間過長的查詢。

查詢統計資訊在不同供應商之間的報告方式有所不同,但在大多數情況下,供應商都有一種方法可以呈現被認為速度慢的查詢。大多數供應商都會顯示查詢陳述式、呼叫次數以及該特定查詢的計時。

例如,DigitalOcean 的查詢統計資訊以表格格式呈現此資訊。

DigitalOcean Query Statistics section

未索引的表格

資料庫表格的索引在概念上與書本中的索引類似。如果書本中沒有索引,您就只能瀏覽每一頁來尋找您感興趣的主題。相反地,如果書本有索引,您可以先在索引中搜尋特定主題,然後就會被導引到正確的頁面。這會大幅減少尋找所需資訊的時間。

相同的概念也適用於資料庫索引。將索引新增至資料庫表格可實現快速查詢。

如果您從表格中的少量資料開始,通常不會立即注意到與索引相關的問題。但是,隨著資料量的增長,缺少索引可能會變得更加明顯。

為您的表格建立索引

資料庫表格的索引需要根據常見的存取模式來建立。建立索引時,您需要指定索引應建立在的欄位或欄。

例如,如果您的表格在 users 表格中有一個 email 欄位,您的應用程式中可能有一個查詢會根據使用者的電子郵件搜尋使用者。如果沒有索引,查詢將會搜尋整個表格以尋找正確的記錄。相反地,如果您在 email 欄位上建立索引,查詢將會先查詢索引以尋找電子郵件值。找到後,它將會指向該使用者的特定資料庫列。

識別新增索引機會的最佳方式是尋找哪些查詢的執行時間過長。此資訊可以在雲端供應商資料庫儀表板的「查詢統計資訊」(或類似名稱)章節中找到。

在所有條件相同的情況下,最好先專注於最慢的回報查詢,方法是為正在使用的存取模式新增索引。然後,您可以向下移動清單,在需要的地方新增索引,直到慢速查詢得到解決。

索引可以使用原始 SQL 建立。雖然具體細節因使用的特定資料庫而異,但建立索引的 SQL 命令可能如下所示

CREATE INDEX email_index ON users (email);

索引建立完成後,隨著時間推移檢查您的查詢統計資訊,看看效能是否有所改善。

使用 EXPLAIN 檢查慢速查詢

在某些情況下,雲端資料庫供應商的查詢統計資訊儀表板可能無法為您提供足夠的資訊。它可能會顯示哪些查詢速度慢,但可能不明確應該建立哪些索引,或者應該如何最佳化您的查詢。

對於這些情況,您可以選擇使用 EXPLAIN 陳述式檢查您的查詢。此陳述式與您的常規查詢結合使用,可用於取得有關查詢執行計畫的詳細資訊。

例如,在 PostgreSQL 中,在常規查詢之前使用的 EXPLAIN 陳述式將產生如下資訊

  • 預估的啟動成本
  • 預估的總成本
  • 預估的輸出列數
  • 列的平均寬度(以位元組為單位)

例如,以下 EXPLAIN 的用法

EXPLAIN SELECT * FROM users;

將產生此報告

QUERY PLAN
-------------------------------------------------------------
Seq Scan on users (cost=0.00..458.00 rows=10000 width=244)

EXPLAIN 陳述式是深入研究特定查詢並分析其成本的寶貴工具。從使用 EXPLAIN 收集到的資訊,超越了雲端供應商在查詢統計報告中提供的資訊,可用於最佳化您的查詢。

龐大的資料量

未最佳化或範圍過於廣泛的查詢可能會從資料庫傳回過多的資料。當從具有最少資料的新資料庫開始時,通常很難檢測到此問題,但隨著資料庫大小的增長,很可能會導致問題。

當從查詢傳回大量資料時,需要將其掃描到資料庫伺服器上的記憶體中。這可能會導致 CPU 尖峰和對突發模式使用的需求。這可能會導致資料庫伺服器崩潰。如果資料是從資料庫伺服器傳回的,如果您的應用程式伺服器配置不足,則資料量也可能太大而無法讓您的應用程式伺服器處理。

解決資料過度提取問題需要最佳化查詢,將選取範圍限定為相關記錄。解決方案通常是使用 WHERE 子句,但您首先需要找到造成問題的查詢。

您的雲端資料庫供應商日誌和指標可以指示從資料庫傳回大量資料。您可能會看到突發信用使用量或 CPU 尖峰。但是,僅從這些指標中很難判斷哪些查詢負責。

應用程式伺服器中的檢測

為了完整了解哪些查詢負責傳回大量資料,您可以將檢測新增至您的應用程式伺服器。New Relic、Datadog 和 Dynatrace 等工具可以監控您的應用程式伺服器,並報告資料傳輸時的大小。尋找應用程式伺服器的哪些端點或區域正在處理大量資料,可以幫助您找出哪些資料庫查詢可能是罪魁禍首。

查詢最佳化

查詢最佳化並非一體適用,而且在很大程度上取決於具體情況。但是,有一些常見類型的最佳化應該考慮。

  • 限定查詢範圍以防止過度提取 - 請務必在適用的情況下使用 WHERE 子句,以減少傳回的資料總量。
  • 僅選取需要的欄位 - 在許多情況下,並非表格中的所有欄位都是提供應用程式所需的。僅選取您的應用程式需要的特定欄位,以防止過度提取。
  • 稽核您的結構描述 - 檢查您的資料庫結構描述,以尋找減少複雜性的機會。依賴許多聯結的查詢通常執行速度緩慢,並且可以透過調整您的結構描述以減少關係來改進。
  • 使用資料庫視圖 - 視圖就像表格一樣,但在執行查詢以預先計算可能需要即時衍生的值時,會預先產生。視圖有其自身的注意事項,並非適用於所有應用程式和使用案例。

結論

應用程式效能不佳通常可以追溯到資料庫的問題。很多時候,這些問題與次佳的查詢有關。

沒有最佳化查詢的萬靈丹。但是,勤奮地分析和檢查某些查詢效能不佳的原因和地點,有助於找出應該調整的特定查詢。一旦確定,對查詢進行調整(例如新增索引、使用 WHERE 子句限定範圍以及選取需要的欄位)可以產生更好的效能。

關於作者
Ryan Chenkie

Ryan Chenkie

Ryan 是一位全端開發人員,對資料庫和 API 特別感興趣。他是 CourseLift 的創辦人,CourseLift 是一個課程託管平台,旨在協助作者進行行銷和銷售。
Daniel Norman

Daniel Norman

Daniel 是一位軟體工程師,在現代網路和雲端環境中擁有廣泛的經驗。他從事資料庫開發已有 15 年以上的時間,並且對開放原始碼和現代開發工具充滿熱情。