前言
mysql 常常会锁表,查询慢等现象,我们如何知道是哪些表被锁了,有哪慢查询呢?然后杀掉对应的进程或优化相应的查询。接下来我们就来一起学习学习。
查询方法
一、查看是否有锁表
show OPEN TABLES where In_use > 0;
二、 mysql查询死锁的表
方法一
在MySQL中,可以通过查询information_schema库中的INNODB_LOCKS和INNODB_LOCK_WAITS表来查看当前发生的死锁信息。以下是一个查询死锁的表的示例SQL语句:
SELECT
r.trx_id waiting_trx_id,
r.trx_mysql_thread_id waiting_thread,
r.trx_query waiting_query,
b.trx_id blocking_trx_id,
b.trx_mysql_thread_id blocking_thread,
b.trx_query blocking_query
FROM
information_schema.innodb_lock_waits w
INNER JOIN information_schema.innodb_trx b ON
b.trx_id = w.blocking_trx_id
INNER JOIN information_schema.innodb_trx r ON
r.trx_id = w.requesting_trx_id;
这个查询将返回当前等待的事务(waiting_trx)和阻塞它的事务(blocking_trx)的详细信息,包括它们的ID、线程ID和正在执行的查询。这些信息可以帮助你识别和解决死锁问题。
方法二
SELECT * FROM information_schema.INNODB_TRX;
方法三:
查看正在锁的事务:
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
查看等待锁的事务:
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
查询进程
SHOW PROCESSLIST;
杀掉进程
有些进程是不能杀掉的,否则会产生很多脏数据或业务上有错误,但查询的进程是可以直接杀掉的,命令如下:
kill trx_mysql_thread_id;