深入理解MySQL锁机制与性能优化:详解记录锁、间隙锁、临键锁及慢SQL查询分析

1. 事务隔离和锁机制详解

在这里插入图片描述

记录锁

第一种情况,当我们对于唯一性的索引(包括唯一索引和主键索引)使用等值查询,精准匹配到一条记录的时候,这个时候使用的就是记录锁。

比如 where id = 1 4 7 10

间隙锁

第二种情况,当我们查询的记录不存在,无论是用等值查询还是范围查询的时候,它使用的都是间隙锁。

临键锁

第三种情况,当我们使用了范围查询,不仅仅命中了 Record 记录,还包含了 Gap 间隙,在这种情况下我们使用的就是临键锁,它是 MySQL 里面默认的行锁算法,相当于记录锁加上间隙锁。

比如我们使用 >5 <9 ,它包含了不存在的区间,也包含了一个 Record 7。

锁住最后一个 key 的下一个左开右闭的区间。

SELECT * FROM t2 WHERE id > 5 AND id <= 7 FOR UPDATE; -- 锁住 (4, 7] 和 (7, 10]
SELECT * FROM t2 WHERE id > 8 AND id <= 10 FOR UPDATE; -- 锁住 (7, 10] 和 (10, +∞)

总结:为什么要锁住下一个左开右闭的区间?——就是为了解决幻读的问题。

MVCC出现幻读问题的本质

为什么出现幻读问题:

假设我们查询表格

在这里插入图片描述

事务A对 user 表执行了 SELECT * FROM user WHERE age > 15 FOR UPDATE; 语句,这将会对满足条件的行加行级锁,以阻止其他事务对这些行进行修改。事务B则尝试插入新数据,但是它不会受到事务A的锁定影响,因为插入操作不会涉及到已存在的行。

-- 第一个事务
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
BEGIN;
SELECT * FROM t2 WHERE name > 6 FOR UPDATE;-- 第二个事务
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
INSERT INTO t2 VALUES (8, '2');
COMMIT;-- 查询锁状态
SELECT * FROM sys.innodb_lock_waits;

在这种情况下,事务A加的锁是行级锁(记录锁),而不是间隙锁(Gap Lock)。行级锁仅锁定满足条件的每一行,而不包括间隙或未满足条件的行。因此,事务B可以在不影响事务A的情况下插入新数据。

第二种情况:

在这里插入图片描述

Read View

MVCC 机制中,多个事务对同一个行记录进行更新会产生多个历史快照,这些历史快照保存在 Undo Log 里。如果一个事务想要查询这个行记录,需要读取哪个版本的行记录呢?这时就需要用到 Read View 了,它帮我们解决了行的可见性问题。Read View 保存了当前事务开启时所有活跃(还没有提交)的事务列表,换个角度,可以理解为 Read View 保存了不应该让这个事务看到的其他的事务 ID 列表。

快照读

读取的是快照数据,不加锁的简单的 SELECT 都属于快照读(只是普通的读操作)。

当前读

当前读就是读取最新数据,而不是历史版本的数据。加锁的 SELECT,或者对数据进行增删改都会进行当前读(包括加锁的读取和 DML 操作)。

如何解决幻读

在快照读情况下,MySQL 通过 MVCC 来避免幻读。

在当前读情况下,MySQL 通过 X 锁或 next-key 来避免其他事务修改:

  1. 使用串行化读的隔离级别
  2. (update、delete)当where条件为主键时,通过对主键索引加record locks(索引加锁/行锁)处理幻读。
  3. (update、delete)当where条件为非主键索引时,通过next-key锁处理。next-key是record locks(索引加锁/行锁) 和 gap locks(间隙锁,每次锁住的不光是需要使用的数据,还会锁住这些数据附近的数据)的结合。

在这里插入图片描述

2. 如何进行慢 SQL 查询

MySQL 官方文档

打开慢日志开关

因为开启慢查询日志是有代价的(跟 bin log、optimizer-trace 一样),所以它默认是关闭的:

SHOW VARIABLES LIKE 'slow_query%';

在这里插入图片描述

除了这个开关,还有一个参数,控制执行超过多长时间的 SQL 才记录到慢日志,默认是 10 秒。

SHOW VARIABLES LIKE '%long_query%';

可以直接动态修改参数(重启后失效)。

SET @@global.slow_query_log = 1; -- 1 开启,0 关闭,重启后失效 
SET @@global.long_query_time = 3; -- MySQL 默认的慢查询时间是 10 秒,另开一个窗口后才会查到最新值 SHOW VARIABLES LIKE '%long_query%'; 
SHOW VARIABLES LIKE '%slow_query%';

或者修改配置文件 my.cnf。

以下配置定义了慢查询日志的开关、慢查询的时间、日志文件的存放路径。

slow_query_log = ON 
long_query_time = 2 
slow_query_log_file = /var/lib/mysql/localhost-slow.log

模拟慢查询:

SELECT SLEEP(10);

查询 user_innodb 表的 500 万数据(检查是不是没有索引)。

SELECT * FROM `user_innodb` WHERE phone 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1487992.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【vue教程】四. Vue 计算属性和侦听器

目录 本章涵盖知识点回顾计算属性&#xff08;Computed&#xff09;创建计算属性计算属性的多样性计算属性的数组过滤计算属性的复杂表达式 计算属性 vs 方法计算属性的实例演示 侦听器&#xff08;Watchers&#xff09;创建侦听器侦听器的高级用法侦听器的深度观察侦听器的立即…

无线遥控控制直流电机和无刷电机开关

一 目的 此文章记录了arduino与陶晶驰串口屏实现联动&#xff0c;点击屏幕双态开关远程控制arduino2560板载的直流电机和无刷电机开关。为手搓乒乓球发球机做准备。 二 接线 2.1串口屏接线 串口屏与Arduino UNO接线如下&#xff1a; ———————————————— RX …

pdf2image:将PDF文档转化为图像的Python魔法

标题&#xff1a;探索pdf2image&#xff1a;将PDF文档转化为图 像的Python魔法 背景 在数字时代&#xff0c;我们经常需要处理各种格式的文档&#xff0c;尤其是PDF文件。PDF以其跨平台的可读性和稳定性而广受欢迎。然而&#xff0c;有时我们需要将PDF文件转换成图像格式&am…

C++ - char*、const char*、char[]、string

const char* const char* 用来定义字符串常量。 char[ ] char型的字符数组是一种定长的数组&#xff0c;存储指定长度的字符序列&#xff0c;数组中的每个元素都是一个char类型的变量&#xff0c;如&#xff1a; char arr[] {h, a, l, l, o, \0}; char c arr[0]; // 访问…

CentOS怎么关闭自动锁屏?

禁止自动锁屏 有时候几分钟不用Centos&#xff0c;系统就自动锁屏了&#xff0c;这是一种安全措施&#xff0c;防止别人趁你不在时使用你的系统。但对于大部分人而言&#xff0c;这是没有必要的&#xff0c;尤其是Centos虚拟机&#xff0c;里面没啥重要的东西&#xff0c;每次…

光伏发电管理软件:光伏企业的核心驱动力

光伏产业面对日益增长的装机容量、复杂多变的运维需求以及激烈的市场竞争&#xff0c;光伏企业如何高效管理、优化运营、提升效益&#xff0c;成为了行业关注的焦点。在此背景下&#xff0c;鹧鸪云光伏发电管理软件应运而生&#xff0c;并逐渐成为光伏企业的核心驱动力。 一、提…

Transformer合集

资料 位置编码&#xff1a;https://zhuanlan.zhihu.com/p/454482273 自注意力&#xff1a;https://zhuanlan.zhihu.com/p/455399791 LN&#xff1a;https://zhuanlan.zhihu.com/p/456863215 ResNet&#xff1a;https://zhuanlan.zhihu.com/p/459065530 Subword Tokenizati…

效率翻倍的秘密:探索AI工具的新世界

大家好&#xff0c;我是你们的效率小助手米兔&#xff01;你是否曾在加班熬夜中挣扎&#xff0c;对着电脑屏幕发呆&#xff0c;感觉工作效率低到怀疑人生&#xff1f;别急&#xff0c;今天我要给你们安利几款超给力的AI工具&#xff0c;让你的工作变得轻松又愉快&#xff01; …

c++笔记4

目录 深度优先搜索DFS DFS的复杂度 DFS与递归 递归与暴力枚举 递归树 DFS与栈 DFS的搜索剪枝 搜索剪枝与优化 可行性剪枝 最优化剪枝 减少等效的分支 优化搜索顺序 搜索的记忆化 搜索的复杂度 大多时候&#xff0c;搜索的复杂度都是指数级的。各种剪枝方案&#…

2024世界技能大赛某省选拔赛“网络安全项目”B模块--操作系统取证解析

2024世界技能大赛某省选拔赛“网络安全项目”B模块--操作系统取证解析 任务一、操作系统取证解析:总结:任务一、操作系统取证解析: A 集团某电脑系统被恶意份子攻击并控制,怀疑其执行了破坏操作,窃取了集团内部的敏感信息,现请分析 A 集团提供的系统镜像和内存镜像,找到…

WIX Toolset 3.11 对本地化的支持方案

1.准备主题文件和本地化文件 WIX Toolset种主题文件为xml文件&#xff0c;负责配置控件的布局&#xff0c; 本地化文件为wxl文件&#xff0c;负责配置待加载的字符串&#xff0c;主题文件根据ID加载需要显示的文字内容。考虑到英文和中文字符长度大小不一&#xff0c;所以这里…

与Bug较量:Codigger之软件项目体检Software Project HealthCheck来帮忙

在软件工程师的世界里&#xff0c;与 Java 小程序中的 Bug 作战是一场永不停歇的战役。每一个隐藏在代码深处的 Bug 都像是一个狡猾的敌人&#xff0c;时刻准备着给我们的项目带来麻烦。 最近&#xff0c;我就陷入了这样一场与 Java 小程序 Bug 的激烈较量中。这个小程序原本应…

【充电模块】

目录 一、实物图 二、原理图 引脚定义 模块特性 原理 三 、简介 四、注意事项 源文件下载 可访问底部联系方式也可前往电子校园网官网搜索关键词 关键词&#xff1a; 充电模块 一、实物图 二、原理图 引脚定…

springboot校园论坛网站-计算机毕业设计源码11401

摘 要 基于Java语言和Springboot框架的校园论坛网站设计与实现&#xff0c;为校园内的师生提供了丰富的功能和便捷的服务。本论文旨在详细介绍该网站的设计思路、功能特点以及技术实现。 论文介绍了网站的注册与登录功能&#xff0c;用户可以通过提供必要信息注册账号&#xf…

代码随想录算法训练营day6 | 242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1.两数之和

文章目录 哈希表键值 哈希函数哈希冲突拉链法线性探测法 常见的三种哈希结构集合映射C实现std::unordered_setstd::map 小结242.有效的字母异位词思路复习 349. 两个数组的交集使用数组实现哈希表的情况思路使用set实现哈希表的情况 202. 快乐数思路 1.两数之和思路 总结 今天是…

yolov8训练自己的实例分割数据集

参考&#xff1a; 1、官方教程&#xff1a;https://docs.ultralytics.com/zh/tasks/segment/ 2、YOLOv8制作自己的实例分割数据集保姆级教程&#xff08;包含json转txt&#xff09; 下载最新yolov8代码 git clone https://github.com/ultralytics/ultralytics.git一、制作自…

【日常记录】【JS】对一个数组,按照某个字段的值,进行分组

文章目录 1. 前言2. lodash 的分组3. Object.groupBy()参考链接 1. 前言 在开发中&#xff0c;经常会遇到一组数据&#xff0c;要按照某个字段进行分组&#xff0c;这个时候会有很多种方法&#xff0c;可以使用 forEach、reduce、等其他方法 reduce 方法 function groupBy(arr…

亚马逊云科技 re:Inforce 2024中国站大会

亚马逊云科技 re:Inforce 2024中国站大会 - 生成式AI时代的全面安全&#xff0c;将于7月25日本周四在北京富力万丽酒店揭幕

最新2024海报制作工具免费下载,赶紧体验!

在这个信息爆炸的时代&#xff0c;一张独特而有吸引力的海报如何打动观众的心已经成为每个人都需要关注的问题。如果你感到困惑&#xff0c;那么你就来到了正确的地方。今天我们要讨论的是免费版本的海报制作软件。我们将从软件的选择、操作模式、设计技巧等方面进行详细的解释…

AlibabaCloudAI

快速体验 Spring Cloud Alibaba AI JDK要求最低17 1.SpringAI Spring AI 旨在简化包含人工智能相关功能的应用程序的开发&#xff0c;避免不必要的复杂性。 Spring AI 的核心是提供抽象&#xff0c;作为开发 AI 应用程序的基础。这些抽象有多种实现方式&#xff0c;只需极少…