目录
[Show Processlist------查看每个与数据库连接的session状态](#Show Processlist——查看每个与数据库连接的session状态)
前言
MySQL阻塞是指并发访问时,某个事务长时间占用资源不释放,导致其他事务受阻或执行缓慢。这可能导致性能下降甚至死锁,需及时处理。阻塞原因主要有锁冲突、长事务和死锁。排查阻塞语句可通过查看进程列表、使用性能监控工具、启用慢查询日志等方法,进而优化查询和索引,调整隔离级别和锁策略。
阻塞语句查询与分析
Show Processlist------查看每个与 数据库 连接的session状态
            
            
              sql
              
              
            
          
          # 展示前100条线程
show processlist;
# 如果想列出全部线程,请使用
show full processlist;
            
            
              sql
              
              
            
          
          mysql> show processlist;
+----+------+-----------+------+---------+------+----------+------------------+
| Id | User | Host      | db   | Command | Time | State    | Info             |
+----+------+-----------+------+---------+------+----------+------------------+
| 15 | root | localhost | NULL | Query   |    0 | starting | show processlist |
+----+------+-----------+------+---------+------+----------+------------------+
1 row in set (0.00 sec)| 字段列 | 含义 | 
|---|---|
| Id | ID标识;要kill一个语句的时候用 | 
| User | 当前连接用户 | 
| Host | 显示这个连接从哪个ip的哪个端口上发出 | 
| db | 使用的数据库名 | 
| Command | 连接状态,一般是休眠(sleep);查询(query);连接(connect); | 
| Time | 连接持续时间;单位是秒 | 
| State | 显示当前sql语句的状态 | 
| Info | 显示这个sql语句 | 
非Sleeping状态进程数
            
            
              sql
              
              
            
          
          select count(1) from information_schema.processlist where command != 'Sleep'执行时间较长进程号
            
            
              sql
              
              
            
          
          select id,time from information_schema.processlist order by time desc limit 5;查看当前运行的所有事务
            
            
              sql
              
              
            
          
          select * from information_schema.innodb_trx;当前锁
            
            
              sql
              
              
            
          
          # 当前的锁
Mysql8.0 之前使用:select * from information_schema.innodb_locks;
Mysql8.0 使用:select * from performance_schema.data_locks;
# 锁等待的对应关系 
Mysql8.0 之前使用:select * from information_schema.innodb_lock_waits;
Mysql8.0 使用:select * from performance_schema.data_lock_waits;被blocking阻塞的事务数
            
            
              sql
              
              
            
          
          SELECT COUNT(BLOCKING_ENGINE_TRANSACTION_ID) FROM performance_schema.data_lock_waits;数据库连接数
            
            
              sql
              
              
            
          
          SHOW STATUS LIKE 'Threads_connected';查看锁状态
            
            
              sql
              
              
            
          
          show status like 'innodb_row_lock_%';
            
            
              sql
              
              
            
          
          mysql> show status like'innodb_row_lock_%';
+-------------------------------+-------+
| Variable_name                 | Value |
+-------------------------------+-------+
| Innodb_row_lock_current_waits | 0     |
| Innodb_row_lock_time          | 0     |
| Innodb_row_lock_time_avg      | 0     |
| Innodb_row_lock_time_max      | 0     |
| Innodb_row_lock_waits         | 0     |
+-------------------------------+-------+
5 rows in set (0.01 sec)| 字段列 | 含义 | 
|---|---|
| Innodb_row_lock_current_waits | 当前等待锁的数量 | 
| Innodb_row_lock_time | 系统启动到现在,锁定的总时间长度 | 
| Innodb_row_lock_time_avg | 每次平均锁定的时间 | 
| Innodb_row_lock_time_max | 最长一次锁定时间 | 
| Innodb_row_lock_waits | 系统启动到现在总共锁定的次数 | 
正在被使用的表
            
            
              sql
              
              
            
          
          show OPEN TABLES where In_use > 0;如果某个事务已经卡住了,可以使用 MySQL的 kill 命令来强制结束该事务,以释放资源。