首页
注册
登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请
登录
V2EX
›
initObject
›
全部回复第 2 页 / 共 2 页
回复总数
22
1
2
❮
❯
2023-02-20 18:08:38 +08:00
回复了
jiangcheng97
创建的主题
›
程序员
›
关于 MySQL Gap Lock 和 Next-Key Lock 的一个问题
正常的 asc 排序中 用最小的值来找第一个
所以首先找到 c=15 的第一条记录
在 c=15 加上 next-key 锁 ( 10,15]
接着向右遍历 找到 c=20 的记录 满足条件 c<=20 在 c=20 加上 next-key 锁( 15,20]
因为是普通索引 引擎认为可能存在不止一条的 c=20 的记录 因此接着向右遍历 找到 c=25 的记录 第一个不满足条件 停止遍历 在 c=25 加上 next-key 锁( 20,25] 因为优化规则 优化为间隙锁 ( 20,25 )
加锁的顺序其实就是索引的遍历顺序 遍历到的记录或者区间都要加锁
2023-02-20 17:41:50 +08:00
回复了
jiangcheng97
创建的主题
›
程序员
›
关于 MySQL Gap Lock 和 Next-Key Lock 的一个问题
在索引遍历的过程上进行加锁
索引搜索指的是就是:
在索引树上利用树搜索快速定位找到第一个值
然后向左或向右遍历
order by desc 就是用最大的值来找第一个
order by asc 就是用最小的值来找第一个
因为 order by id desc 所以首先在普通索引找到 c=20 的第一条记录
在 c=20 加上 next-key 锁 (15,20]
因为是普通索引 引擎认为可能存在不止一条的 c=20 的记录 因此向右遍历找到第一条不符合条件的记录 c=25 加上间隙锁( 20,25 )
然后 开始在索引上向左遍历扫描 扫描过程中 记录 c=15 符合条件 加上 next-key 锁 (10,15]
可能存在不止一条 c=15 的记录 继续向左扫描 得到记录 c=10 (第一个不符合条件 c>=15 停止遍历) 加上 next-key 锁 ( 5,10]
因为没有使用覆盖索引 在 c=15,c=20 对应行记录加上 主键的 行锁
1
2
❮
❯
关于
·
帮助文档
·
博客
·
API
·
FAQ
·
实用小工具
·
4530 人在线
最高记录 6679
·
Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 9ms ·
UTC 09:59
·
PVG 17:59
·
LAX 01:59
·
JFK 04:59
Developed with
CodeLauncher
♥ Do have faith in what you're doing.