查询mysql 哪些表正在被锁状态

今天晚上,我在维护一个电商网站的数据库时,突然发现数据库的响应速度变慢了,就像老牛拉车一样。
我立即打开MySQL命令行并输入“show engine innodb status\G;”看看会发生什么。
结果屏幕上出现了一堆乱码,但仔细一看,发现SQL语句和索引死锁了。
例如有一条SQL语句是这样的:
更新订单设置状态 = '已发货',其中 order_id = 1 2 3 4 5 6 7 8 9 AND 状态 = '待处理';
这让我意识到也许这个更新操作导致了死锁。
然后,我输入“显示进程列表;”和“show status like '%lock%'”来查看当前的锁表状态。
当然,多个进程被锁定,其中一个正在等待更新另一个进程已锁定的行。

我决定首先优化更新SQL语句,并更改“WHERE”子句中的条件顺序,例如:
更新订单 SET 状态 = '已发送' WHERE 状态 = '待处理' AND order_id = 1 2 3 4 5 6 7 8 9 ;
优化后,我运行了“show processlist;”再次“show status like '%lock%'”,发现锁的数量明显减少了。
此时我突然想到,如果开启慢查询日志,那么慢SQL的跟踪和优化会更容易。
所以我打开my.cnf文件并将以下内容添加到[mysqld]部分:
Slow_query_log=TRUE Slow_query_log_file=/usr/local/mysql/slow_query_log.txt long_query_time=3
设置完成后,我保存了配置文件并重新启动了MySQL服务。
接下来打算观察一段时间,看看数据库性能有没有提升。
等等,还有一件事,我需要检查磁盘空间,以确保不是空间不足导致的性能问题。

【MySQL】MySQL查询锁表的SQL语句

保证数据一致性,使用锁控制并发。

共享锁允许多读、少写,而独占锁则禁止所有读和写。

要检查表锁定状态,请使用 SHOW LOCKS。

用户表id1 ,排它锁,检查锁状态。

从经验上来说,我还是证实了这一点。

自己掂量一下。