最近因排查MySQL中一个SQL查询缓慢问题,用到了一些排查问题的SQL,在这里进行下总结及延申
一、查看所有数据库连接线程状态
sql
SHOW PROCESSLIST;
关键列解析:
Command类型:
常用相关查询
sql
-- 查找慢查询(按执行时间倒序排序)
SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST
WHERE COMMAND = 'Query'
ORDER BY TIME DESC;
-- 清理空闲连接(查找空闲超过10分钟的连接)
SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST
WHERE COMMAND = 'Sleep' AND TIME > 600;
-- 找出被阻塞的事务
SELECT *
FROM INFORMATION_SCHEMA.INNODB_TRX trx
JOIN INFORMATION_SCHEMA.PROCESSLIST pl
ON trx.trx_mysql_thread_id = pl.ID
WHERE trx.trx_state = 'LOCK WAIT';
二、查询正在执行的事务
sql
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX ORDER BY trx_started DESC;
列解析:
三、查看当前死锁信息
SHOW ENGINE INNODB STATUS
核心部分深度解析
1. BACKGROUND THREAD
显示 InnoDB 主线程状态:
text
srv_master_thread loops: 1000 srv_active, 10 srv_shutdown, 100 srv_idle
srv_master_thread log flush and writes: 1100
- srv_active:活动循环次数
- srv_idle:空闲循环次数
- log flush:日志刷新次数
2. SEMAPHORES (信号量/锁等待)
text
OS WAIT ARRAY INFO: reservation count 100, signal count 99
Mutex spin waits 200, rounds 3000, OS waits 50
RW-shared spins 150, OS waits 30; RW-excl spins 80, OS waits 20
关键指标:
- OS waits:操作系统级等待次数(值高表示严重锁竞争)
- spin waits:自旋锁等待次数
- 高值警告:OS waits > 0.5% of spin waits 需优化
3. TRANSACTIONS (事务状态)
最重要的诊断部分:
text
---TRANSACTION 123456789, ACTIVE 10 sec
2 lock struct(s), heap size 360, 1 row lock(s), undo log entries 1
MySQL thread id 42, OS thread handle 0x7f8d12345678, query id 999 localhost root
UPDATE users SET status=1 WHERE id=100
------- TRX HAS BEEN WAITING 5 SEC FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 333 page no 3 n bits 72 index `PRIMARY` of table `test`.`users`
trx id 123456789 lock_mode X waiting
关键信息:
- 事务ID和持续时间
- 持有/等待的锁(lock_mode X 表示排他锁)
- 阻塞的SQL语句
- 线程关联信息
4. LATEST DETECTED DEADLOCK (最新死锁)
text
*** (1) TRANSACTION:
TRANSACTION 111111, ACTIVE 5 sec starting index read
mysql tables in use 1, locked 1
UPDATE t1 SET col=1 WHERE id=10
*** (1) HOLDS THE LOCK(S):
RECORD LOCKS space id 100 page no 5 ...
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 200 page no 8 ...
*** (2) TRANSACTION:
TRANSACTION 222222, ACTIVE 3 sec starting index read
UPDATE t2 SET col=1 WHERE id=20
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 200 page no 8 ...
*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 100 page no 5 ...
死锁分析要素:
- 冲突的事务和SQL语句
- 各自持有的锁
- 相互等待的资源
- 最终牺牲的事务(WE ROLL BACK TRANSACTION (2))
5. FILE I/O (I/O 线程)
text
I/O thread 0 state: waiting for i/o request (insert buffer thread)
I/O thread 1 state: waiting for i/o request (log thread)
I/O thread 2 state: doing file i/o (read thread)
Pending normal aio reads: 0, aio writes: 0
ibuf aio reads: 0, log i/o's: 0, sync i/o's: 0
监控点:
- I/O线程状态(waiting/doing i/o)
- 挂起的异步I/O操作数量
6. BUFFER POOL AND MEMORY (缓冲池)
text
Buffer pool size 32768
Free buffers 1024
Database pages 30000
Modified db pages 500 # 脏页数量
Reads 100000, creates 2000, writes 3000
Buffer pool hit rate 999 / 1000 # 命中率99.9%
关键指标:
- Modified db pages:需刷盘的脏页(突然增加可能致性能下降)
- Hit rate:缓冲池命中率(应 > 95%)
- Reads:磁盘读取次数(高则需扩大缓冲池)
7. ROW OPERATIONS (行操作)
text
Main thread process no. 1000, id 888888, state: sleeping
Number of rows inserted 10000, updated 5000, deleted 200, read 999999
0.00 inserts/s, 0.00 updates/s, 0.00 deletes/s, 10.00 reads/s
性能监控:
- 主线程状态
- 行操作统计(绝对值+每秒速率)
- 突然的速率变化可能预示问题