MySQL 性能調優入門 - 慢查詢分析與索引優化基礎
性能問題診斷的通用思路
當數據庫出現性能問題時,切忌盲目猜測或隨意調整參數。一個科學的診斷流程通常包括:
- 基于數據,而非猜測 (Data-Driven, Not Guesswork):利用我們在上一篇討論的性能監控指標和建立的基線。查看哪些指標偏離了正常范圍?QPS、TPS、連接數、CPU 使用率、I/O 等待、InnoDB 緩沖池命中率等。
- 明確問題范圍 (Define the Problem Scope):
- 問題是具體表現為什么?是某個特定查詢變慢?是整個系統響應遲緩?是 CPU/內存/I/O 資源耗盡?
- 問題何時開始?是突然發生還是逐漸惡化?
- 是否與某些特定事件相關聯(例如,新代碼上線、數據量激增、配置變更、特定時間段的批處理任務)?
- 縮小排查范圍 (Narrow Down the Scope):
- 是 CPU 密集型問題(CPU 使用率高,
Threads_running
多)? - 是 I/O 密集型問題(
iowait
高,磁盤讀寫繁忙,緩沖池命中率低)? - 是 內存不足問題(Swap 使用增加,OOM 發生)?
- 還是網絡問題(連接延遲高,丟包)?
- 問題是否集中在特定的查詢、特定的表、或者特定的時間段?
- 是 CPU 密集型問題(CPU 使用率高,
- 善用診斷工具 (Utilize Diagnostic Tools):
SHOW GLOBAL STATUS;
/SHOW GLOBAL VARIABLES;
:查看 MySQL 服務器狀態和配置。SHOW PROCESSLIST;
(或information_schema.processlist
):查看當前正在執行的線程和查詢。- 慢查詢日志 (Slow Query Log):記錄執行時間超過閾值的查詢。
EXPLAIN
命令: 分析 SQL 查詢的執行計劃。performance_schema
和sys
schema (MySQL 5.6+): 提供更細致的性能監控和診斷信息。- Percona Toolkit (如
pt-query-digest
,pt-stalk
) 等第三方工具。
頭號公敵:慢查詢分析
大多數數據庫性能問題的根源往往在于低效的 SQL 查詢。
啟用與配置慢查詢日志
確保慢查詢日志已開啟,并設置合理的閾值。
- 配置 (輸入 -
my.cnf
或my.ini
):[mysqld] slow_query_log = ON # 開啟慢查詢日志 slow_query_log_file = /var/log/mysql/mysql-slow.log # 日志文件路徑 (確保 MySQL 用戶有權限寫入) long_query_time = 1 #