简单并且许多人仍然犯的错误,MySQL 中 UPDATE 语句如果没有使用索引,确实可能引发严重的锁等待问题,具体表现和影响如下:(在磁盘io、内存占用、CPU都不高。)
- 📌 问题本质:全表扫描导致锁范围扩大
- 有索引时:通过索引快速定位目标行,仅对匹配行加 行锁(row lock)或 间隙锁(gap lock)。(索引的选择性太差)
- 无索引时:无法快速定位行,只能进行全表扫描,导致对所有行加锁(行锁 + 间隙锁),相当于锁表。虽然不是严格意义上锁住整张表,但是他们锁定了所有记录,从表现结果来看,相当于对其进行了锁表处理。
事务隔离级别影响:
在 REPEATABLE READ(RR)级别下,即使不满足 WHERE 条件的行也会被锁住,直到事务结束。
在 READ COMMITTED(RC)级别下,不满足条件的记录锁会被立即释放,但仍可能引发短时间的锁等待。