首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 效能優化實戰:從硬體基準測試到 SQL 級問題定位的四步法

     編輯:MySQL 綜合教學

MySQL 效能優化實戰:從硬體基準測試到 SQL 級問題定位的四步法

面對資料庫效能問題,切忌上來就調 SQL 或加索引。資深專家燕師傅教學的標準化四步定位法:硬體基準 → 宏觀狀態監控 → 進程狀態分析 → SQL 剖析優化。本文完整複現實戰流程與腳本。

步驟一:硬體基準測試 (sysbench) — 確認物理上限

若硬體 IOPS 僅 100MB/s,軟體優化再強也無法支撐 200MB/s 需求。

# 1. CPU 測試 (素數運算)
sysbench --test=cpu --cpu-max-prime=2000000 run

# 2. IO 測試 (隨機讀寫 3GB)
sysbench --test=fileio --num-threads=16 --file-total-size=3G --file-test-mode=rndrw prepare
sysbench --test=fileio --num-threads=16 --file-total-size=3G --file-test-mode=rndrw run
sysbench --test=fileio --num-threads=16 --file-total-size=3G --file-test-mode=rndrw cleanup

# 3. OLTP 測試 (模擬交易負載)
sysbench --test=oltp --mysql-table-engine=myisam --oltp-table-size=1000000 \
  --mysql-socket=/tmp/mysql.sock --mysql-user=test --mysql-host=localhost --mysql-password=test prepare
sysbench --test=oltp ... run

步驟二:宏觀狀態監控 — 抓取關鍵指標時間序列

核心三指標:Queries (累計查詢數)、Threads_connected (當前連接數)、Threads_running (活躍執行緒數)。

# 監控腳本 (每秒採樣)
#!/bin/bash
while true; do
  mysql -e "SHOW GLOBAL STATUS WHERE Variable_name IN ('Queries','Threads_connected','Threads_running');" \
  | awk 'NR>1 {print $2}' | xargs | sed 's/ /,/g' >> mysql_status.csv
  sleep 1
done

壓測工具 ab 模擬併發:

ab -c 50 -n 2000 https://target/page.php

結果分析兩大模式

模式QPS 曲線優化方向
平穩型穩定水平線SQL/索引/配置/引擎/架構優化
週期性尖峰鋸齒狀/定時暴增緩存失效策略 (隨機 TTL/錯峰)、業務分批 (分省/分時段)、尖峰期開啟慢查詢日誌

步驟三:進程狀態分析 — 找出 MySQL 花時間在幹什麼

# 採樣腳本
while true; do
  mysql -e "SHOW FULL PROCESSLIST\G" | grep -E '^ *State:' | sort | uniq -c >> mysql_process.csv
  sleep 1
done

重點關注的 State 狀態

State含義優化方向
Creating tmp table建立臨時表 (如 ORDER BY/GROUP BY/DISTINCT)優化索引覆蓋、避免不必要排序
Sending data傳輸結果集減少 SELECT *、限制 LIMIT、分頁優化
Sorting for group分組排序複合索引支援排序
Copying to tmp table on disk內存臨時表溢寫磁碟增加 tmp_table_size、優化 JOIN、避免大結果集
Locked等待鎖縮短交易、降低隔離級別、避免長交易
Converting HEAP to MyISAM記憶體表轉磁碟表同 Copying to tmp table

步驟四:SQL 級剖析 — 定位具體語句瓶頸

# 開啟 Profile
SET profiling = 1;

-- 執行目標 SQL
SELECT * FROM t1 JOIN t2 JOIN t3 ORDER BY title LIMIT 10;

# 查看 Profile 記錄
SHOW PROFILES;
-- 找到 Query_ID (如 27)
SHOW PROFILE FOR QUERY 27;

實戰案例:三表 JOIN + ORDER BY 導致磁碟臨時表

  • 現象:Profile 顯示 Copying to tmp table on disk 耗時 6 秒
  • 原因:三表 JOIN 產生大中間結果,ORDER BY title 無法用索引覆蓋,需回表排序,超過 tmp_table_size 溢寫磁碟
  • 優化:
    1. 建立複合索引支援 WHERE + ORDER BY
    2. 子查詢先過濾再 JOIN
    3. 業務層面:分頁少查、引入 Redis 緩存熱點列表

總結:標準化優化閉環

  1. 硬體基準:sysbench 量化上限,排除物理瓶頸
  2. 宏觀監控:腳本採樣 QPS/連接/執行緒,識別平穩/週期模式
  3. 進程分析:統計 State 分布,鎖定 Copying to tmp table/Sending data 等高耗時狀態
  4. SQL 剖析:Profile 定位具體階段,結合 EXPLAIN 精準優化索引/結構/業務

遵循此四步法,從「感覺慢」走向「數據驅動的精準優化」。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved