当前位置: 首页 > news >正文

MYSQL-- 行锁在索引命中与覆盖情况下的加锁行为

一、行锁与索引

  • 行锁(Record Lock):锁住索引记录对应的行。

  • 索引相关概念

术语解释
索引命中查询条件用到了某个索引
索引覆盖查询的字段完全包含在索引中,不需要访问数据行(回表)
索引未命中查询条件没有用到任何索引,进行全表扫描

二、详细分析


1. 行锁(Record Lock)

a. 索引命中 + 索引覆盖

  • 行为:只锁住索引记录对应的行。

  • 性能:最优,锁粒度细,避免不必要的锁冲突。

示例

CREATE TABLE users (id INT PRIMARY KEY,name VARCHAR(50),age INT,INDEX idx_age(age)
);-- 查询使用 age 索引,并且只查询 age 字段(覆盖索引)
SELECT age FROM users WHERE age = 30 FOR UPDATE;
  • 加锁范围:锁住 age=30 对应的索引记录。

  • 不回表,锁更轻。


b. 索引命中,但非覆盖索引(需要回表)

  • 行为:锁住索引记录对应的行,然后回表锁住对应的聚簇索引记录(InnoDB 主键索引的记录)。

  • 性能:略低于覆盖索引,因为要回表。

示例

-- 查询用索引条件,但查询列不全在索引中
SELECT name FROM users WHERE age = 30 FOR UPDATE;
  • 首先锁住 age=30 的索引记录

  • 回表访问聚簇索引记录,对主键索引记录加行锁

  • 锁范围更大,开销稍大


c. 索引未命中(全表扫描)

  • 行为:无法定位具体行,InnoDB 会锁整张表(表锁)。

  • 性能:最差,锁冲突多。

示例

SELECT * FROM users WHERE name = 'Alice' FOR UPDATE;
  • 如果 name 没有索引,则全表扫描

  • 无法加行锁,退化为表锁

  • 影响其他并发事务

http://www.lryc.cn/news/601549.html

相关文章:

  • 随机密码生成
  • RTSP|RTMP播放器 in Unity:开源不够用?从工程视角重新定义播放器选型
  • Tkinter美化 - 告别土味Python GUI
  • 设计模式(二)创建型:工厂方法模式详解
  • 哈希表应用(map,set共同作用)
  • ubuntu18.04解压大的tar.gz文件失败
  • MySQL 全详解:从入门到精通的实战指南
  • vulhub-red靶机攻略
  • 优化Linux高并发:文件描述符与端口范围的协同调优
  • 【橘子分布式】gRPC(番外篇-客户端重试机制)
  • Python爬虫实战:研究tldextract库相关技术构建新闻网站域名分析爬虫系统
  • Java学习-------桥接模式
  • 3D芯片香港集成:技术突破与产业机遇全景分析
  • Python操作Excel文件完整指南
  • 依赖倒置原则 Dependency Inversion Principle - DIP
  • 2025 环法对决,VELO Angel Glide 坐垫轻装上阵
  • python优秀案例:基于python flask实现的小说文本数据分析与挖掘系统,包括K-means聚类算法和LDA主题分析
  • HBuilder X打包发布微信小程序
  • rust-包和箱子
  • 主要分布于内侧内嗅皮层的层Ⅲ的边界向量细胞(BVCs)对NLP中的深层语义分析的积极影响和启示
  • day062-监控告警方式与Grafana优雅展示
  • 【Oracle】套接字异常(SocketException)背后隐藏的Oracle问题:ORA-03137深度排查与解决之道
  • EasyExcel使用(二:写出)
  • MySQL 8.0.42创建MGR集群
  • vue3报错:this.$refs.** undefined
  • nacos连接失败,启动失败常见问题
  • Vue 框架 学习笔记
  • 【笔记】Einstein关系式 D = ukBT 的推导与应用研究
  • GAN/cGAN中到底要不要注入噪声
  • 计算机网络:(十二)传输层(上)运输层协议概述