mysql如何通过索引减少行锁范围_mysql索引与加锁逻辑

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助手,依托大模型,帮助用户记录、整理和分析音视频内容,体验用大模型做音视频笔记、整理会议记录。

相关推荐
川冰ICE1 小时前
Python爬虫实战⑲|Pandas数据合并与重塑,多数据源整合
爬虫·python·pandas
代码中介商1 小时前
MySQL 核心进阶:事务、隔离级别与视图实战
数据库·mysql
七爷不在我这里1 小时前
oracle的26版本及以下 Null的判断及空串判定
数据库·oracle
acanab1 小时前
isaaclab资产打包的一种方式
vscode·python·机器人·isaac lab
Be reborn1 小时前
从一行 CSV 到一次浏览器操作:关键字驱动执行引擎设计
python·自动化·pytest
创意岛1 小时前
AI时代,你的品牌在城市发展中“被消失”了吗?
人工智能·python
weixin_444012931 小时前
CSS如何实现单选按钮自定义样式_利用伪元素隐藏默认UI
jvm·数据库·python
X56611 小时前
CSS如何利用Grid重写老旧的表格布局
jvm·数据库·python
思麟呀1 小时前
MySQL复合查询与内外连接
android·数据库·mysql