簡介
如果您的應用程式速度變慢,很有可能問題至少部分與您的資料庫有關。
瞭解您的應用程式效能問題可能涉及資料庫是減少延遲的良好第一步。棘手的部分在於找出這些瓶頸可能存在於何處以及為何存在。
本文涵蓋了在資料庫中造成效能瓶頸的一些最常見問題,以及可以採取的一些補救措施。
資料庫日誌和指標
如果不檢視日誌,就無法診斷資料庫中的瓶頸。大多數雲提供商都提供豐富的資訊,供您評估查詢的執行情況,但可能很難理解這些資訊在說什麼。
探索日誌、指標和查詢統計
大多數雲資料庫提供商,包括 DigitalOcean、AWS、Google Cloud Platform、MongoDB Atlas 等,都提供檢視日誌的入口。熟悉這些日誌資訊的佈局和結構非常重要,以便您日後能更輕鬆地發現問題。
例如,DigitalOcean 提供一個名為“日誌與查詢”(Logs & Queries)的標籤頁,可直接從部署管理選單訪問。
在此部分中,有一個名為“最近日誌”(Recent Logs)的子部分,提供即時日誌資訊顯示。
這些日誌中包含的資訊可能對您嘗試解決的特定瓶頸問題有用,也可能沒用。但是,某些資訊(例如會話持續時間)可能會指示會話長時間連線到資料庫的情況。
探索指標儀表板
您的雲資料庫提供商的指標儀表板能讓您最深入地瞭解可能遇到的瓶頸。大多數雲提供商會顯示與效能相關的資訊,例如:
- 系統和程序 CPU 使用率
- 快取使用率
- 記憶體
- 連線數
檢視系統 CPU 使用率等指標可能會發現與資源限制相關的問題。您可能會看到與執行備份等管理任務相關的用量峰值。持續的高用量可能表明您的資料庫伺服器資源不足。
探索查詢統計
您的雲資料庫提供商的查詢統計報告可能是確定性能瓶頸來源的最佳資訊來源。在許多情況下,效能下降可以追溯到執行時間過長的查詢。
不同提供商的查詢統計報告方式不同,但在大多數情況下,提供商都有辦法顯示被認為是慢速的查詢。大多數提供商會顯示查詢語句、其被呼叫的次數以及該特定查詢的執行時間。
例如,DigitalOcean 的查詢統計以表格形式顯示此資訊。
未索引的表
資料庫表的索引在概念上類似於書中的索引。如果沒有書中的索引,您將不得不翻閱每一頁來查詢您感興趣的主題。如果書有索引,您可以先在索引中搜索特定主題,然後它會指向正確的頁面。這大大減少了查詢所需資訊所需的時間。
同樣的理念也適用於資料庫索引。為資料庫表新增索引可以實現快速查詢。
如果您一開始表中只有少量資料,通常不會立即注意到與索引相關的問題。然而,隨著資料量的增長,缺乏索引的問題會變得更加明顯。
為您的表建立索引
資料庫表的索引需要根據常見的訪問模式建立。建立索引時,您需要指定索引應基於的列或欄位。
例如,如果您的 users 表中有一個 email 欄位,您的應用程式中可能有一個根據電子郵件搜尋使用者的查詢。如果沒有索引,查詢將遍歷整個表來查詢正確的記錄。相反,如果您在 email 欄位上建立索引,查詢將首先查詢索引以查詢電子郵件值。找到後,它將指向該使用者的特定資料庫行。
識別新增索引的最佳方法是查詢哪些查詢執行時間過長。此資訊可以在您的雲提供商資料庫儀表板的“查詢統計”(Query Statistics)部分(或類似部分)中找到。
在其他條件相同的情況下,最好首先透過為正在使用的訪問模式新增索引來關注報告中最慢的查詢。然後您可以依次處理列表,在需要的地方新增索引,直到慢速查詢得到解決。
可以使用原始 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子句以減少返回的資料總量。 - 僅選擇所需欄位 - 在許多情況下,並非您表中的所有欄位都為您的應用程式所必需。僅選擇您的應用程式所需的特定欄位以防止過度獲取。
- 審計您的模式(Schema) - 檢查您的資料庫模式(Schema),尋找降低複雜性的機會。依賴大量連線的查詢通常執行緩慢,可以透過調整您的模式(Schema)以減少關係來改進。
- 使用資料庫檢視 - 檢視類似於表,但透過執行查詢預先計算值而生成,這些值否則可能需要即時派生。檢視有其自身的注意事項,並非適用於所有應用程式和用例。
結論
糟糕的應用程式效能通常可以追溯到資料庫問題。很多時候,這些問題與次優查詢有關。
查詢最佳化沒有萬能藥。然而,認真分析和檢查某些查詢為何表現不佳,有助於鎖定需要調整的具體查詢。一旦確定,對查詢進行調整,例如新增索引、使用 WHERE 子句限定範圍以及僅選擇所需欄位,可以顯著提高效能。
如果您正在使用 Prisma,您可以在我們的效能和最佳化文件中瞭解如何衡量和最佳化查詢。




