MySQL行锁和表锁如何区分_通过explain查看锁等待机制.txt

MySQL行锁按索引记录加,WHERE不走索引会导致全表扫描并加临键锁,甚至升级为表锁;唯一索引下WHERE id=1仅加记录锁,非唯一索引则加临键锁;ORDER BY+LIMIT是否缩小锁范围取决于是否命中索引。WHERE 条件没走索引,全表扫描就等于全表加锁MySQL 的行锁(比如 UPDATE 或 SELECT ... FOR UPDATE)不是按"行"加的,而是按"索引记录"加的。如果 WHERE 条件无法命中索引,InnoDB 只能走聚簇索引全扫描------这时每条记录都会被加上临键锁(next-key lock),锁住整个范围,甚至可能升级为表锁。常见错误现象:SHOW ENGINE INNODB STATUS 里看到大量 RECORD LOCKS,但业务只改一行,却卡住其他无关更新使用场景:高并发下单、库存扣减、账户余额变更等对一致性要求高的写操作验证是否走索引:务必用 EXPLAIN 看 type 是否为 range/ref/const,且 key 列非 NULL注意隐式类型转换:比如 user_id 是 INT,但传了字符串 '123',会导致索引失效 → 全表锁联合索引顺序错,等于白建联合索引 (a, b, c) 能加速 WHERE a=1 AND b=2,但对 WHERE b=2 AND c=3 完全无效------不仅查不到,而且加锁也会落到聚簇索引上,锁住所有满足 b=2 的行(即使 c 不匹配)。参数差异:WHERE a=1 锁的是索引中 a=1 对应的所有索引项;WHERE a=1 AND b>2 锁的是 (a=1, b>2) 的临键区间,范围更小容易踩的坑:把高频过滤字段放在联合索引后位,比如 (created_at, user_id),但查询总以 user_id 为条件 → 索引失效 → 加锁变宽性能影响:错误顺序会让原本只锁几十行的操作,变成锁几千行,阻塞明显SELECT ... FOR UPDATE 在唯一索引和非唯一索引下加锁行为完全不同这是最容易被忽略的细节:同样是 WHERE id = 123,如果 id 是主键或唯一索引,InnoDB 只加一条记录上的记录锁(record lock);但如果 id 是普通索引(哪怕有唯一约束但没定义为 UNIQUE),就会加临键锁(next-key lock),锁住该值前后的间隙。 通义听悟 阿里云通义听悟是聚焦音视频内容的工作学习AI助手,依托大模型,帮助用户记录、整理和分析音视频内容,体验用大模型做音视频笔记、整理会议记录。

相关推荐
蜡笔羊驼7 分钟前
ModuleNotFoundError: No module named ‘torchvision.transforms.functional_tensor‘
linux·人工智能·python
李航198310 分钟前
DeepDraw 网页版
人工智能·python·计算机视觉·ai·ai编程
code_slave(码畜)18 分钟前
微服务架构落地:分库分表实战(下) —— 分布式主键、跨分片查询与分页聚合防坑
数据库·spring boot·分布式·spring cloud·微服务·架构·分库分表
企业数字化笔记19 分钟前
一段视频有两次跳投,动作分析为什么要先做事件分段?
人工智能·python·音视频
dishugj33 分钟前
https://blog.csdn.net/dishugj/article/details/162068579
数据库·系统架构
时间售卖铺36 分钟前
MySQL 安装部署
运维·数据库·mysql·云原生
Aurorar0rua42 分钟前
CS50 x 2024 Notes Python - 02
开发语言·python·学习方法
泡海椒44 分钟前
JQuick-SQL 子查询:WHERE、SELECT、HAVING 与派生表实践
数据库·sql
用户0510122572961 小时前
SQLite 学习博客(一):从零建库,理解 SQLite 的角色与第一张表
数据库·sqlite
樱桃木1 小时前
回测可信度审查:样本外测试的五种常见自欺
python