0

0

SQL数据库间隙锁范围计算_索引边界解析

冷炫風刃

冷炫風刃

发布时间:2026-01-10 21:39:08

|

979人浏览过

|

来源于php中文网

原创

间隙锁范围由索引结构和SQL实际访问的索引点决定,锁定相邻索引值间的开区间,需通过EXPLAIN确认所用索引及扫描类型,再依B+树前驱后继确定具体间隙。

sql数据库间隙锁范围计算_索引边界解析

间隙锁(Gap Lock)的范围不是凭空确定的,而是严格依赖于索引结构和当前事务中执行的 SQL 语句所涉及的索引记录。它的核心逻辑是:锁定**两个相邻索引值之间的“间隙”**,不包括记录本身(那是行锁的事),也不包括无穷边界以外的部分。要准确计算间隙锁范围,必须先搞清语句命中了哪个索引、扫描到了哪些索引点、以及这些点在索引树中的前驱与后继是谁。

看执行计划,确认走的是哪个索引

间隙锁只作用于被实际使用的索引。如果 SQL 没走索引(例如全表扫描),InnoDB 在可重复读下可能升级为临键锁(Next-Key Lock),但不会单纯加间隙锁。所以第一步永远是 EXPLAIN

  • 检查 key 列是否非 NULL,确认走了哪个索引(PRIMARY、idx_name、idx_age 等)
  • type 是 range、ref 还是 eq_ref,判断是单点查找还是范围扫描
  • 注意 possible_keyskey 是否一致,避免因隐式类型转换导致索引失效

按索引顺序列出所有“触达”的索引值

所谓“触达”,指查询条件在索引 B+ 树中定位或遍历时真正访问到的索引项。例如:

Short AI
Short AI

AI短视频生成器,轻松创作爆款短视频!

下载
  • SELECT * FROM t WHERE age > 18 AND age —— 若 age 有索引,且现有数据中 age 值为 20、22、24,则扫描覆盖的索引点是 20、22、24;间隙锁会落在 (−∞,20)、(20,22)、(22,24)、(24,+∞) 中被扫描影响的部分
  • SELECT * FROM t WHERE name > 'Li' AND name —— 需把索引中实际存在的 name 值(如 'Liu', 'Lu', 'Wu')按字典序排出来,再找相邻间隙
  • 等值查询 WHERE id = 100 不加间隙锁(只加记录锁),但如果写成 WHERE id > 99 AND id ,哪怕只命中一行,也会锁住 (99,100) 和 (100,101) 两个间隙

识别前驱与后继,确定实际锁定的开区间

间隙锁的本质是防止其他事务在该间隙中插入新记录,因此它总是以“前一个已存在索引值”和“后一个已存在索引值”为边界。关键细节:

  • 若查询范围左端无对应索引记录(如 age > 100,而最大 age 是 95),则左边界为前一个最大值,右边界为 +∞ → 锁 (95, +∞)
  • 若查询扫到索引最左端(如 name ,而最小 name 是 'Bao'),则锁 (−∞, 'Bao')
  • 唯一索引上的等值查询(WHERE uniq_col = x)不加间隙锁;但普通索引上的相同语句,在 RR 隔离级别下会加 Next-Key 锁,即 record lock + gap lock,覆盖 (prev, x]

注意唯一索引 vs 普通索引的行为差异

这是最容易出错的地方:

  • 唯一索引(含主键):等值查询命中记录 → 只加记录锁;未命中 → 加间隙锁,范围是该值在索引顺序中应处位置的前后间隙(例如查 id=50,但表中只有 49 和 51,则锁 (49,51))
  • 普通索引:即使等值查询命中,只要不是唯一约束,InnoDB 默认使用 Next-Key Lock(record + gap),即锁住 (prev, current];若配合 SELECT ... FOR UPDATE 或更新语句,还可能进一步扩大
  • 联合索引要按最左前缀匹配,间隙边界由整个索引元组决定,比如 idx(a,b),查 WHERE a = 1 AND b > 5,间隙基于 (1,5)、(1,7)、(1,10) 这样的组合值来算

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

676

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

320

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

346

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1094

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

357

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

675

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

571

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

414

2024.04.29

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

79

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号