目錄標題
- **1. 檢查當前運行的查詢和進程**
- **2. 查看死鎖日志**
- **方法一:通過錯誤日志**
- **方法二:通過InnoDB狀態**
- **3. 檢查鎖信息**
- **查看表鎖**
- **查看行鎖(InnoDB)**
- **4. 分析慢查詢**
- **開啟慢查詢日志**
- **分析慢查詢**
- **5. 監控系統資源**
- **6. 其他優化建議**
- **總結步驟**
要排查MySQL響應慢是否由堵塞或死鎖引起,可以按照以下步驟操作:
1. 檢查當前運行的查詢和進程
-- 查看所有當前連接和執行的查詢
SHOW PROCESSLIST;
- Sleep:空閑連接(可優化連接池配置)。
- Locked:鎖等待(可能存在堵塞)。
- Query:執行中的查詢(關注長時間未完成的SQL)。
2. 查看死鎖日志
方法一:通過錯誤日志
- 定位MySQL錯誤日志路徑(通常為
/var/log/mysql/error.log
),搜索關鍵詞DEADLOCK
。
方法二:通過InnoDB狀態
-- 查看InnoDB引擎狀態(包含死鎖信息)
SHOW ENGINE INNODB STATUS;
重點關注LATEST DETECTED DEADLOCK
部分。
3. 檢查鎖信息
查看表鎖
-- 顯示當前被鎖定的表
SHOW OPEN TABLES WHERE In_use > 0;
查看行鎖(InnoDB)
-- 查看當前鎖信息
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;-- 查看鎖等待關系
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
4. 分析慢查詢
開啟慢查詢日志
# 修改MySQL配置文件(my.cnf)
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 2 # 設置慢查詢閾值(秒)
重啟MySQL后,慢查詢會被記錄到日志中。
分析慢查詢
-- 查看最近執行時間最長的查詢
SELECT * FROM information_schema.processlist ORDER BY Time DESC LIMIT 10;-- 使用EXPLAIN分析查詢執行計劃
EXPLAIN SELECT * FROM your_table WHERE condition;
5. 監控系統資源
檢查CPU、內存、磁盤I/O是否飽和:
# 查看CPU和內存
top# 查看磁盤I/O
iostat -x 5
6. 其他優化建議
- 優化索引:確保查詢使用了合適的索引。
- 事務控制:避免長時間運行的事務。
- 調整配置:根據負載優化
innodb_buffer_pool_size
、innodb_log_file_size
等參數。 - 連接池優化:減少連接數或調整連接超時時間。
總結步驟
- 確認是否有死鎖:通過日志或
SHOW ENGINE INNODB STATUS
。 - 定位堵塞源頭:通過
SHOW PROCESSLIST
和鎖相關表。 - 分析慢查詢:優化SQL和索引。
- 檢查資源瓶頸:確保硬件資源充足。
如果問題持續,建議提供具體日志或查詢語句以便進一步分析。