資料庫在任何應用程式的效能方面都扮演著關鍵角色。MySQL 資料庫也不例外。因此,請務必瞭解有助於改善應用程式效能的多種資料庫調整、設計和設定方式。以下是一些 MySQL 可以最佳化以達到最佳效能的方法。
查詢微調
資料庫效能微調會從應用程式開始。應用程式如何將業務需求轉譯成資料庫查詢,大幅改善應用程式的複雜度與效率。真正的效能衡量標準是指每個資料庫執行個體對業務需求的貢獻效率。
結構定義設計
實體和關係在關聯式資料庫中的定義方式,決定了回應對資料庫查詢來說有多簡單或複雜。同時,主鍵和次要索引的定義也扮演著重要的角色。
伺服器設定
伺服器設定負責最佳化及最大化系統資源的使用率。系統資源包括核心處理單元 (CPU) 核心、實體機器或虛擬機器 (VM) 上的記憶體、基礎儲存系統和網路。
動態伺服器微調
持續監控、最佳化和效能微調,以配合實際動態調整資料庫工作負載。
本文著重於查詢微調。而後續文章將涵蓋其他主題。
我們通常會藉由查看資料庫查詢來展開查詢微調程序。建議的做法是先評估業務需求轉譯為資料庫查詢的效率。從業務需求到查詢的解讀與處理作業,決定了查詢成本的多寡。
首先,請安排要最佳化的查詢:
在資料庫結構定義設計期間,必須最佳化這兩個類別。
交易是一種邏輯單元,其中所有的陳述式都會完整修訂或復原。交易是一種針對 MySQL 提供完整性、一致性、獨立性和耐用性 (ACID) 的功能。
在 MySQL 適用的儲存引擎 InnoDB 中,所有使用者活動都發生在交易中。根據預設,系統會啟用自動修訂模式,也就是說,每個 SQL 陳述式都會自行建立單一交易。如要在啟用自動修訂時執行多陳述式交易,請使用 START_TRANSACTION 或 START_TRANSACTION 明確啟動交易,並以 START_TRANSACTION 或 START_TRANSACTION 結尾。如果自動修訂模式已停用,工作階段一律會開啟交易,直到 COMMIT 或 COMMIT 結束該交易並啟動新的交易為止。
交易的的最佳做法就是盡量縮短其時間。這是因為長期交易存在幾項缺點,詳情請參閱本文。
1. 鎖定爭用時間較長,導致查詢速度變慢及查詢可能失敗
2. 大量的復原記錄會造成伺服器效能降低
3. 磁碟使用量增加
4. 關閉時間較長
5. 當機復原時間較長
查詢可在應用程式端或資料庫端擷取。
開發時,記錄資料庫查詢及查詢的執行時間,兩者皆是極佳做法。應用程式端記錄可讓您輕鬆評估該查詢在其業務情境中的成效和效率。舉例來說,使用者可能會記錄每筆查詢的回應時間,或針對特定功能記錄回應時間。如要取得多陳述式交易的總執行時間,也相當簡單。
此外,從應用程式端記錄測得的查詢回應時間是一種端對端測量,包括網路時間。這能補足資料庫記錄的查詢執行時間,讓您輕鬆判斷問題是出在網路還是資料庫。
Cloud SQL MySQL 查詢洞察
Cloud SQL 查詢洞察工具可用於擷取、監控及診斷查詢。
查詢洞察功能可讓您根據執行時間和執行頻率,輕鬆找出熱門查詢。
這項工具提供篩選選項,包括時間範圍、資料庫、使用者帳戶和用戶端位址。當中的圖表可以顯示 CPU 使用率,以及 IO 和鎖定等待時間的明細。「熱門查詢和標記」表格會根據執行時間列出最熱門的查詢,並將查詢正規化。除了執行時間,這項工具還會提供「平均掃描列數」和「平均傳回的列數」等統計資料,深入分析查詢效率。
使用 performance_schema
在 MySQL 適用的 Cloud SQL 中,MySQL 8.0.26 以及具備 15 GB 以上記憶體的更高版本的系統預設會啟用 performance_schema 功能。如要啟用或停用該功能,您必須重新啟動執行個體。
當 performance_schema=ON 時,查詢陳述式工具會預設為啟用。sys.statement_analysis 資料表提供正規化查詢的匯總統計資料。這可回答以下這類問題:
如果你使用 MySQL Workbench,該服務會根據系統檢視產生效能結構定義報表。報表中會有一個「高成本 SQL 陳述式」專區,提供查詢效能的深入分析資訊。
使用慢速記錄 + 工具
慢速記錄功能會擷取執行超過 long_query_time 的所有查詢。還會記錄查詢執行時間、鎖定時間、已檢查的資料列和已傳送的資料列。相較於使用一般記錄,額外的執行統計資料使其成為分析資料庫查詢時的更理想選擇。
建議您啟用慢速記錄功能。一般來說,long_query_time 應維持在合理的門檻,以便擷取您打算查看和最佳化的查詢。
log_output=FILE
slow_query_log=ON
long_query_time=2
一段時間過後,建議您將 long_query_time=0 設定為在短時間內擷取所有查詢,並取得查詢量和效能的總覽。
有一些工具 (例如 mysqldumpslow 和 pt-query-digest) 會擷取查詢簽名,並產生報告,顯示查詢統計資料。
此外,還有其他第三方監控工具可以針對查詢統計資料產生報告,例如:Percona Monitoring and Management、SolarWinds Database Performance Monitor (舊稱 VividCortex) 等。
擷取交易中的查詢後,下一步就是最佳化查詢。
EXPLAIN 指令提供查詢執行計畫,從 8.0.18 開始,EXPLAIN ANALYZE 指令會執行陳述式並產生 EXPLAIN 輸出及執行的時間。
MySQL 查詢洞察可以讓您輕鬆存取 EXPLAIN 方案。
要在輸出結果中尋找什麼內容?
工作階段狀態變數可用來取得查詢執行作業詳細資料。
首先,請清除工作階段變數,然後執行查詢並檢查計數器。舉例來說,Handler_* 狀態會顯示資料存取模式和資料列數量。Created_* 會顯示是否已建立臨時資料表和/或磁碟上的臨時資料表。Sort_* 則會顯示排序合併通過的次數,以及已排序的列數。如要進一步瞭解工作階段變數,請參閱此說明文件。
SHOW PROFILE 陳述式可依據執行階段提供查詢執行時間,或許也會派上用場。
瞭解查詢執行計畫後,您可透過多種方式影響及最佳化查詢執行計畫。
為了針對特定查詢最佳化伺服器設定,強烈建議您使用工作階段層級變數,而不要變更會影響所有工作階段的全域值。
常用的工作階段值如下:
簡單來說,我們討論了查詢微調的三個面向: