起因:生产监控使用cat监控服务性能,记录longsql 1000ms 语句很简单 update table set field='1' where fieldb='any';(字段b有索引)
将语句单独拿出来在测试环境执行不存在慢的问题,将生产slowlog拿下来也没有发现有记录该语句,与对应同事沟通发现存在longsql的语句对应的feildb都是某业务条件下同一时间存在更新频率很高的情况估计有一两百次。所以怀疑是同一时间更新mysql锁等待导致。另外了解到慢sql记录并不记录获取锁的时间,而cat监控是包含锁等待时间,这样就合理的解释了一个简单的语句为何执行时间如此长久。
验证mysql慢查询不记录锁等待
T1 | T2 |
begin;select * from t1 where feildb='xxx' for update; | |
- | select * from t1 where feildb='xxx' for update; |
rollback; | |
此时看slowlog并没有记录T2执行的语句 | 1 row in set (3.53 sec) |
验证更新字段锁等待情况 PS:网上很多很人说有索引是锁行没索引是锁表,我没复现 :)mysql版本5.7.19
T1
mysql> begin;
Query OK, 0 rows affected (0.01 sec)
mys