【每日八股】复习 MySQL Day3:锁

文章目录

  • 昨日内容复习
    • MySQL 使用 B+ 树作为索引的优势是什么?
    • 索引有哪几种?
    • 什么是最左匹配原则?
    • 索引区分度?
    • 联合索引如何排序?
    • 使用索引有哪些缺陷?
    • 什么时候需要建立索引,什么时候不需要?
    • 使用索引的注意事项
  • 复习 MySQL Day3:锁
    • MySQL 有哪些类型的锁?每种类型的锁当中又具体有哪些锁?
      • 按锁的粒度分类
        • 全局锁
        • 表级锁
          • 表锁
          • 元数据锁(MDL)
        • 行级锁(InnoDB 特有)
          • 记录锁(Record Locks)
          • 间隙锁(Gap Locks)
          • 临键锁(Next-Key Locks)
          • 插入意向锁(Insert Intention Locks)
      • 按锁的模式分类
        • 共享锁(S锁)
        • 排他锁(X锁)
      • 特殊锁类型
        • 自增锁(Auto Inc Locks)
        • 谓词锁(Predicate Locks)
    • 意向锁的作用是什么?什么时候需要加意向锁?
    • MySQL 的全局锁有什么作用?
    • MySQL 如何加锁?
      • 加锁的基本流程
      • 不同操作的加锁规则
      • InnoDB 行锁的加锁过程
      • 锁的升级与转换

昨日内容复习

MySQL 使用 B+ 树作为索引的优势是什么?

B+ 树是一种多叉树,其非叶子结点仅存放索引,而叶子结点存放真正的数据,叶子结点之间通过双向链表连接,可以优化查询效率。

通过 B+ 树存储千万级别的数据,在访问时只需要进行 3 ~ 4 次的磁盘 I/O 操作。在对 B+ 树进行修改时,由于 B+ 树仅在叶子结点存放真正的数据,因此修改数据时不会修改树的结果。与 B 树相比,由于 B 树在叶子结点和非叶子结点都会存放数据,因此 B 树在修改时可能会涉及树的变形。

索引有哪几种?

  • 单值索引:一个索引只包含一个列,一个表可以包含多个单值索引;
  • 唯一索引:索引列的值必须唯一,但允许存在重复的 null;
  • 主键索引:设定数据库表中某个键为主键时,该主键会自动成为主键索引;
  • 复合索引:一个索引包含多个列;
  • 前缀索引:对字符类型的前几个字符建立索引;

什么是最左匹配原则?

MySQL 的最左匹配原则是 B+ 树联合索引的核心特性,指查询时必须从索引的最左列开始,并按照联合索引的定义顺序依次匹配,否则联合索引失效。

需要注意的是,根据最左匹配原则,当复合索引当中出现范围查询时,该范围查询将会生效,但是范围查询之后的条件均不生效。

索引区分度?

当查询优化器发现所使用索引当中某个值出现的比例超过某个阈值(比如 30%)时,查询优化器将放弃走索引,转而进行全表扫描。

联合索引如何排序?

可以利用所有的有序性,在排序列和索引列建立联合索引。

使用索引有哪些缺陷?

索引本身也是一张表,建立索引需要占用存储空间。

此外,索引不宜建立在频繁增删改的字段上,增删改的字段如果建立了索引,那么原表和索引表都需要修改,增加额外的时间开销。

什么时候需要建立索引,什么时候不需要?

需要建立索引

  • 表的主键:自动成为主键索引;
  • 表当中某个字段需要唯一性约束:对该字段建立唯一索引;
  • 直接进行条件查询的字段:经常使用 WHERE 查询的字段,建立索引可以提高效率;
  • 宜对外键建立索引;
  • 对排序字段建立索引可以大大提高排序速度;
  • 常用于 GROUP BY 和 ORDER BY 的字段可以建立联合索引。

不宜建立索引的场景

  • 表中某个需要频繁增删改的字段不宜建立索引;
  • 表的记录很少时,可以直接走全表扫描;
  • 数据重复且分布均匀的字段不宜建立索引;
  • 经常和其他字段一起查询但其他字段的索引值较多的字段不宜建立索引。

使用索引的注意事项

  • like 前导模糊查询会使索引失效;
  • 负向查询不能使用索引;
  • 联合查询注意最左匹配原则;
  • 避免过度使用索引,因为建立索引会引入额外的存储与维护开销;
  • 更新频繁的字段不宜建立索引;
  • 避免在索引列引入算式或函数,如是会使索引列失效并退化为全表扫描;

复习 MySQL Day3:锁

在这里插入图片描述

MySQL 有哪些类型的锁?每种类型的锁当中又具体有哪些锁?

按锁的粒度分类

全局锁
  • FLUSH TABLES WITH READ LOCK(FTWRL):锁定整个数据库实例(注意是整个数据库,而不是某个表),所有数据表进入只读状态。全局锁主要用于数据备份的场景。
表级锁
表锁
  • 基本表锁:LOCK TABLES ... READ/WRITE
  • 意向锁(Intention Locks):进一步细分为意向共享锁(IS)和意向排他锁(IX);
  • 与行锁的功能类似,表锁的核心作用也是并发控制:协调多个会话对同一个表的并发访问,防止并发操作导致的数据不一致。表锁以整张表为单位进行锁定,是最简单之间的并发控制方式。
  • 表锁的使用场景包括:数据库备份操作、大批量数据导入/导出、需要确保数据一致性的复杂多表操作。
元数据锁(MDL)

元数据锁:

  • 自动加锁,用于保护表结构的变更;
  • 读锁:查询时自动读取;
  • 写锁:表结构更改时获取。
行级锁(InnoDB 特有)
记录锁(Record Locks)

记录锁用于锁定索引中的单条记录,是最基本的行锁类型。

间隙锁(Gap Locks)
  • 记录锁用于锁定索引记录间的间隙。
  • 可防止幻读现象的发生。
  • 仅在「可重复读」隔离级别下生效。
临键锁(Next-Key Locks)
  • 临键锁是记录锁和间隙锁的组合。
  • 临键锁可以锁定当前记录及当前记录之前的间隙,具体来说,临键锁锁定的是一个「左开右闭」区间,上一条索引值到当前索引值之间的间隙将会被锁定,避免在读写期间有新的记录插入这个区间。
  • 临键锁是 InnoDB 的默认行锁实现方式。
插入意向锁(Insert Intention Locks)
  • 插入意向锁是特殊的间隙锁,需要注意的是,插入意向锁是行锁,要与表级的意向锁区分开来。
  • 一个事务在向数据表中插入一条数据时,需要先判断插入位置是否有间隙锁(注意,临键锁也包含间隙锁)。如果有,那么当前插入操作会被阻塞,直到拥有间隙锁的事务提交。在当前事务阻塞期间,会生成一个插入意向锁,表明事务想在某个区间插入新记录,但是目前处于等待状态。

按锁的模式分类

共享锁(S锁)
  • 共享锁又称读锁,通过 SELECT ... LOCK IN SHARE MODE 的方式加锁。
  • 共享锁允许多个事务同时获取。
排他锁(X锁)
  • 排他锁又称写锁,通过 SELECT ... FOR UPDATE 的方式获取。
  • 排他锁一次只能由一个事务持有。

特殊锁类型

自增锁(Auto Inc Locks)

自增锁用于自增列的插入操作,它是特殊的表级锁。

谓词锁(Predicate Locks)

在串行化隔离级别下生效,锁定满足特定搜索条件的行。

意向锁的作用是什么?什么时候需要加意向锁?

意向锁是 InnoDB 中特殊的表级锁,它在行锁和表锁之间起到了关键的协调作用。

意向锁的核心作用

  • 多粒度锁定协调:解决表锁和行锁的共存问题,使不同粒度的锁能够高效协同工作;
  • 快速冲突检测:提供一种“预先声明”机制,避免在加表锁时还需要检查行锁状态。

意向锁的工作机制
首先,意向锁是表锁。之后,意向锁分为意向共享锁(IS)和意向排他锁(IX)。具体来说:

  • IS:表示事务准备在表的某些行加共享锁;
  • IX:表示事务准备在表的某些行加排他锁。

何时会加意向锁

  • IS:当事务需要加行级 S 锁时,会首先自动加表级的 IS 锁;
  • IX:当事务需要加行级 X 锁时,会首先自动加表级的 IX 锁。

意向锁的价值

  • 避免在加表锁时检查索引行的状态来查看是否有行已经加表锁,直接查看意向锁这个表级锁就可以得知当前表中是否有行被加锁。
  • 意向锁可以预防死锁:在加行锁之前,必须先获取意向锁,然后才能够加行锁。

MySQL 的全局锁有什么作用?

MySQL 全局锁的作用是做全库逻辑备份,加全局锁之后整个数据库处于只读状态,增删改会被阻塞。

全局锁的缺陷在于当数据库数据过多时,全局备份时间较慢,由于不能增删改,因此会使业务停滞。一个优化的方法是通过可重复读隔离级别下的 MVCC。

MySQL 如何加锁?

下面以 InnoDB 引擎为例,简述 MySQL 的加锁过程。

加锁的基本流程

锁的触发时机

  • 自动加锁:DML 语句(INSERT / DELETE / UPDATE)时自动获取;
  • 手动加锁:SELECT ... FOR UPDATE 加排他锁,SELECT ... LOCK IN SHARE MODE 加排他锁;
  • DDL 加锁:表的结构变更时自动加锁。

加锁的基本步骤

  1. 解析 SQL 以确定需要访问的表以及行;
  2. 获取意向锁(表级);
  3. 根据隔离级别和查询条件确定锁的类型以及查询范围;
  4. 在存储引擎层加实际的行锁 / 表锁;
  5. 记录锁信息到内存结构。

不同操作的加锁规则

SELECT 语句

  • 普通 SELECT(快照读):不加锁;
  • SELECT ... FOR UPDATE:加排他锁;
  • SELECT ... LOCK IN SHARE MODE:加共享锁。

DML 语句

  • INSERT:排他锁 + 插入意向锁;
  • UPDATE:先加共享锁查找,再加排他锁修改;
  • DELETE:加排他锁。

InnoDB 行锁的加锁过程

基于索引的加锁

-- 假设有索引 idx_age
UPDATE users SET name='yggp' WHERE age=25;

加锁步骤:

  1. 通过 idx_age 找到 age=25 的记录;
  2. 获取对应行的排他锁;
  3. 如果当前隔离级别是可重复读,那么还会加间隙锁防止幻读。

无索引时加锁

-- 无合适索引的列
UPDATE users SET name='yggp' WHERE phone='123456';

加锁步骤:

  • 全表扫描:对所有扫描到的行加锁;
  • 风险:容易导致大量锁冲突和性能问题。

锁的升级与转换

锁升级条件
当单个事务锁定的行超过 innodb_change_buffer_max_size 时,系统自动将行锁升级为表锁。

锁转换场景
指的是先加共享锁的行如果后续需要修改,那么共享锁将升级为排他锁。UPDATE 语句的加锁过程就是先通过共享锁找到对应的记录,再加排他锁对数据进行修改。

-- 事务内的锁转换示例
BEGIN;
SELECT * FROM accounts WHERE id=1 LOCK IN SHARE MODE;	-- 获取 S 锁
-- 下面执行 UPDATE, S -> X
UPDATE accounts SET balance=100 WHERE id=1;				-- S -> X

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Arkts完成数据请求http以及使用axios第三方库

import http from ohos.net.http Entry Component struct HttpPage {State message: string Hello Worldbuild() {Column({space:20}) {Row(){Button(发送http请求).onClick(()>{let httpRequest http.createHttp();httpRequest.request(https://zzgoodqc.cn/index.php/in…

SELinux 从理论到实践:深入解析与实战指南

文章目录 引言:为什么需要 SELinux?第一部分:SELinux 核心理论1.1 SELinux 的三大核心模型1.2 安全上下文(Security Context)1.3 策略语言与模块化 第二部分:实战操作指南2.1 SELinux 状态管理2.2 文件上下…

CD34.【C++ Dev】STL库的string的使用 (上)

目录 1.知识回顾 2.串联类和对象的知识重新理解 构造函数 string(); string (const string& str); string (const string& str, size_t pos, size_t len npos); string (const char* s); string (size_t n, char c); append和push_back string& append …

Git常用指令速查

Git常用指令速查 基本操作类&#xff1a; git init &#xff1a;初始化仓库git log&#xff1a;查看日志&#xff0c;这个命令很重要&#xff01;git add <文件名|.>&#xff1a;添加到暂存区git commit -m 注释&#xff1a;提交到仓库git merge <分支名>&#xf…

探索无人机模拟环境的多元景象及AI拓展

无人驾驶飞行器&#xff08;UAVs&#xff09;在各行各业的迅速普及&#xff0c;从农业和检测到空中操作和人机交互等令人兴奋的前沿领域&#xff0c;都引发了一个关键需求&#xff1a;强大而逼真的模拟环境。直接在物理硬件上测试尖端算法存在固有的风险——成本高昂的坠机、中…

AI Agent开源技术栈

构建和编排Agent的框架 如果您是从头开始构建&#xff0c;请从这里开始。这些工具可以帮助您构建Agent的逻辑——做什么、何时做以及如何处理工具。您可以将其视为将原始语言模型转化为更自主的模型的核心大脑。 2. 计算机和浏览器的使用 一旦你的Agent能够规划&#xff0c…

jspm老年体检信息管理系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 信息化时代&#xff0c;各行各业都以网络为基础飞速发展&#xff0c;而医疗服务行业的发展却进展缓慢&#xff0c;传统的医疗服务行业已经逐渐不满足民众的需求&#xff0c;有些还在以线下预约的方式接待病人&#xff0c;特别是针对于老年体检的服务&#xff0c;是少之又…

ESP32- 开发笔记- 软件开发 4 - GPIO 口

1 背景介绍 GPIO&#xff08;General Purpose Input/Output&#xff09; ——通用输入输出口&#xff0c;就是能由软件自由控制输入&#xff08;接收外界信号&#xff09;或输出&#xff08;发出电平信号&#xff09;的引脚。 ESP32 最核心的功能之一&#xff0c;能被用来控制…

格式工厂:多媒体转换工具

格式工厂&#xff08;FormatFactory&#xff09;是一款免费且功能全面的多媒体格式转换工具&#xff0c;支持视频、音频、图片及文档等多种格式的转换&#xff0c;覆盖超过70种语言&#xff0c;并兼容Windows XP至Win10/11系统。软件基于FFmpeg解码库开发&#xff0c;支持高效转…

在Anolis OS 8上部署Elasticsearch 7.16.1与JDK 11的完整指南

目录 1. 环境与版本选择 1.1 操作系统选择:Anolis OS 8 1.2 版本匹配说明 1.3 前置条件检查 2. JDK 11安装与配置 2.1 安装流程 2.2 配置详解 3. Elasticsearch 7.16.1安装与优化 3.1 基础安装 3.2 目录规划与权限 3.3 核心配置文件详解 3.4 JVM调优 4. 用户权限管…

Java中final关键字的作用?

在Java中&#xff0c;final 关键字用于表示不可变性&#xff0c;具体作用取决于它修饰的目标&#xff08;变量、方法或类&#xff09;。以下是其核心作用&#xff1a; 1. 修饰变量&#xff08;常量&#xff09; 基本类型变量&#xff1a;值不可更改&#xff08;常量&#xff09…

自动伴随无人机说明文档

自动伴随无人机说明文档 一、无人机参数二、能力说明三、操作流程3.1 模式定义3.2 启动流程3.3 可调参数&#xff08;建议默认&#xff09; 四、特别注意五、最后 一、无人机参数 型号&#xff1a;S400视觉pro版轴距&#xff1a;400mm起飞重量&#xff1a;1300g额外载重&#…

53.[前端开发-JS实战框架应用]Day04-Bootstrap入门到项目实战

Bootstrap入门到实战 1 认识Bootstrap 认识Bootstrap Bootstrap起源和历史 Bootstrap3-5版本的区别 Bootstrap优缺点 学习Bootstrap的理由 2 Bootstrap安装 Bootstrap4的安装 方式一 : CDN <!DOCTYPE html> <html lang"en"> <head><meta cha…

C#:创建变量和类的实例

在 C# 编程中&#xff0c;类作为引用类型&#xff0c;创建其变量和实例涉及到内存分配等重要概念。以下为你详细介绍创建类实例的步骤和相关操作。 类的声明与变量声明 类的声明就像是创建类实例的蓝图。当我们声明一个类后&#xff0c;就能够创建该类的实例。类属于引用类型…

<el-date-picker 设置记录时间早于当前时间 (包含时分秒)

<el-date-picker 设置记录时间早于当前时间 &#xff08;包含时分秒&#xff09; <el-date-pickerv-else-if"item.type datetime"v-model"state.ruleForm[item.key]"type"datetime":placeholder"item.title"format"YYYY-M…

Tailwind CSS 响应式设计解析(含示例)

本文内容&#xff1a; Tailwindcss V4 中如何使用响应式设计功能&#xff0c;包括默认断点、自定义断点、断点范围控制以及容器查询的各种技巧&#xff0c;帮助你在不离开 HTML 的前提下优雅构建响应式页面。 &#x1f31f; 默认断点用法&#xff08;移动优先&#xff09; Tail…

生态修复项目管理软件

在“双碳”目标与生态文明建设的双重驱动下&#xff0c;生态修复项目正成为全球环境治理的核心战场。然而&#xff0c;矿山复绿、湿地修复、水土保持等工程往往面临跨地域、多主体、长周期的管理难题——从数据分散到进度失控&#xff0c;从成本超支到风险频发&#xff0c;传统…

基于PyTorch的图像分类特征提取与模型训练文档

概述 本代码实现了一个基于PyTorch的图像特征提取与分类模型训练流程。核心功能包括&#xff1a; 使用预训练ResNet18模型进行图像特征提取 将提取的特征保存为标准化格式 基于提取的特征训练分类模型 代码结构详解 1. 库导入 import torch import torch.nn as nn import…

写一个 Java 程序,用于将字符串中的指定子串替换为另一个子串

以下是一个 Java 程序&#xff0c;它可以将字符串中的指定子串替换为另一个子串。 public class SubstringReplacement {public static String replaceSubstring(String original, String oldSubstring, String newSubstring) {return original.replace(oldSubstring, newSubs…

Docker 容器双网卡访问物理雷达网络教程

作者&#xff1a; 陈梓洋 环境&#xff1a; ubuntu 22.04lts 时间&#xff1a; 2025年4月29日 Docker 容器双网卡访问物理雷达网络教程 这个教程适用于这样的场景&#xff1a;容器保留原有 ROS 通信网络&#xff08;如 bridge 网络&#xff09;&#xff0c;同时需要访问一个物…