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

MySQL 服務器變慢排查全流程:CPU、記憶體、I/O、網路與優化對策

     編輯:MySQL 綜合教學

現象

資料量達百萬/千萬級時,MySQL 響應逐漸變慢。需系統性排查而非盲目調參數。

一、作業系統層面檢查

1. CPU 與 I/O:sar

sar -u 2 10  # 每 2 秒採樣,共 10 次
關鍵欄位:
%user  用戶進程佔用
%sys   系統核心佔用
%wio   等待 I/O 佔用(>35% 疑似 I/O 瓶頸)
%idle  空閒(長期 0 表示 CPU 滿載)

2. 記憶體與整體:vmstat

vmstat 1 10
關注欄位:
r      運行隊列進程數(> CPU 核心數 4 倍即 CPU 瓶頸)
si/so  swap in/out(持續非 0 表示記憶體不足)
bi/bo  磁碟讀/寫塊數
us/sy/id/wa  CPU 細分

3. 磁碟 I/O 優化

  • 資料目錄掛載在 RAID 10(速度與冗余平衡)
  • 使用 SSD/NVMe,關閉 atime 掛載參數
  • innodb_flush_method=O_DIRECT 避免雙重緩衝

4. 網路檢查

  • telnet host 3306 測試連通性
  • 檢查防火牆、安全組、skip-networking 是否關閉
  • netstat -antp | grep 3306 觀察連線狀態

二、MySQL 內部排查

慢查詢日誌

[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1          # 超過 1 秒記錄
log_queries_not_using_indexes = 1

分析工具:pt-query-digest、mysqldumpslow

進行中的查詢

SHOW FULL PROCESSLIST;
-- 或
SELECT * FROM information_schema.PROCESSLIST WHERE TIME > 10;

InnoDB 狀態

SHOW ENGINE INNODB STATUS\G
關注:
- SEMAPHORES:鎖等待
- TRANSACTIONS:長事務
- FILE I/O:I/O 併發
- BUFFER POOL:命中率、髒頁比例

三、常見優化對策

瓶頸對策
CPU 高優化慢 SQL、加索引、減少複雜 JOIN、啟用 Query Cache(低寫入場景)
記憶體不足增加 RAM、調大 innodb_buffer_pool_size (60-80% RAM)、減少 sort_buffer_size 等線程私有緩衝
I/O 高RAID 10、SSD、分離 redo log/undo log/data 到不同磁碟、innodb_flush_neighbors=0 (SSD)
鎖競爭縮短事務、避免大事務、行鎖升級表鎖檢查、innodb_lock_wait_timeout 調整
連線過多連線池複用、max_connections 評估、thread_cache_size 調大

四、硬體升級建議

  1. 記憶體: 最費效比高,直接提升 Buffer Pool 命中率
  2. 儲存: NVMe SSD 降低隨機讀寫延遲,適合 InnoDB
  3. CPU: 高主頻、多核心利於並行查詢與壓縮/解壓
  4. 網路: 10GbE 減少主從同步、備份傳輸時間

監控先行:部署 Prometheus + Grafana + node_exporter + mysqld_exporter,建立基準線,變慢時才有比較依據。

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