MySQL总结(索引,Explain,MVCC和隔离级别,锁)

news2024/10/7 15:27:06

文章目录

    • 一、索引
      • 1.索引构成
      • 2.如何查找
      • 3.最左匹配原则
      • 4.覆盖索引
      • 5.减少冗余索引和重复索引
        • 1.冗余索引
        • 2.重复索引
      • 6.索引适用情况和注意事项
        • 1.适用情况
        • 2.注意事项
    • 二、Explain执行计划
      • 1.Explain语句
    • 三、隔离级别与MVCC
      • 1.事前准备
      • 2.四个事务并发的问题
        • 1.脏写
        • 2.脏读
        • 3.不可重复读
        • 4.幻读
      • 3.MVCC原理
        • 1.版本链
        • 2.关于脏写
        • 3.ReadView
          • 判断方法
        • 4.MVCC小结
    • 四、锁
      • 1.解决并发问题的两种方式
        • 解决方案
          • 1.MVCC进行控制
          • 2.读写操作都加锁
        • 2.一致性读
        • 3.锁定读
          • 1.共享锁和排他锁
          • 2.锁定读

一、索引

1.索引构成

索引构成分为五部分

  • record_type:类型,0,1,2,3分别代表普通记录,目录项纪录,最小纪录,最大纪录
  • next_record:记录偏移量
  • 列的值
  • 其他信息

如图所示:

image-20230619190645137

2.如何查找

1.先二分查找目录项,比如要查找的纪录是20,(那么这个纪录就在页9)

2.再二分查找这些纪录,进而找到对应的值

image-20230619191916925

为了避免出现多个页列的名称一直,在插入的时候不知道新的数据出现在哪里,我们设置除了二级索引列新增了一个主键作为区别

image-20230620112558807

3.最左匹配原则

比如我们建立复合索引(name,birth,phone),这个索引就是先按照name,再birthphone

4.覆盖索引

查找的列中只包含索引列,防止回表查询

5.减少冗余索引和重复索引

1.冗余索引

CREATE TABLE person_info(
        id INT UNSIGNED NOT NULL AUTO_INCREMENT,
        name VARCHAR(100) NOT NULL,
        birthday DATE NOT NULL,
        phone_number CHAR(11) NOT NULL,
        country varchar(100) NOT NULL,
        PRIMARY KEY (id),
        KEY idx_name_birthday_phone_number (name(10), birthday, phone_number),
        KEY idx_name (name(10))
);

2.重复索引

CREATE TABLE repeat_index_demo (
        c1 INT PRIMARY KEY,
        c2 INT,
        UNIQUE uidx_c1 (c1),
        INDEX idx_c1 (c1)
);

6.索引适用情况和注意事项

1.适用情况

1.全值匹配

2.范围查询

3.精确查询某一行并范围查询另一行

4.模糊查询左边的列

5.用于排序

6.用于分组

2.注意事项

  1. 用于搜索,排序和分组创建索引
  2. 为列的基数大的创建索引
  3. 索引列的类型小
  4. 索引列如果在表达式单独出现可以创建索引(不要2* index<4这种)
  5. 避免聚簇索引页分裂,尽量让索引auto_increment
  6. 删除冗余和重复索引
  7. 使用覆盖索引

二、Explain执行计划

1.Explain语句

image-20230620142506334

三、隔离级别与MVCC

1.事前准备

CREATE TABLE hero (
        number INT,
        name VARCHAR(100),
        country varchar(100),
        PRIMARY KEY (number)
) Engine=InnoDB CHARSET=utf8;
INSERT INTO hero VALUES(1,'刘备','蜀');

2.四个事务并发的问题

1.脏写

事务修改了另外一个事务未提交的数据

2.脏读

事务读到了另外一个事务未提交的数据

3.不可重复读

事务读到了另外一个已经提交的事务修改过的数据,并且其他事务对这个数据修改提交后,该事务都能取到最新的值

对于这个数据被删除被读到的情况也属于不可重复读

4.幻读

事务先根据条件查询出来一些纪录,然后其他事务新增了符合条件的纪录,原来的事务查询该条件,可以把新插入的纪录读出来

如果数据变少了,也就是删除这种情况不是幻读,幻读诗读到了之前没有的值

image-20230620150132236

3.MVCC原理

1.版本链

对于InnoDB来说,聚簇索引需要两个必要隐藏列

  • trx_id:每次事务对聚簇索引纪录改动,都会被transaction_id赋值给trx_id
  • roll_pointer:每次聚簇索引改动,都会被旧的版本写入undo日志,方便找到修改之前的信息

2.关于脏写

image-20230620153040891

这种情况不就沦为了 脏写了吗,InnoDB保证不会有脏写的情况发生,也就是trx100更新后,就会给这个事务加锁,知道这个事务commit,把锁释放之后才可以更新

3.ReadView

核心问题: 需要判断版本链的那些版本是当前事务可见的

m_ids:在生成ReadView中活跃读写事务的事务id列表

min_trx_id:生成ReadView中读写事务的最小事务id,也是m_idsmin_id

max_trx_id:生成ReadView时候系统分配下一个事务id

max_trx_id不是m_ids的最大值,比如我们有3个事务1,2,3,事务3已经提交,m_ids=[1,2],但是我们要分配的下一个id是max_trx_id=4

creator_trx_id: 生成这个事务的事务id

对事务改动insert,delete,update才会分配事务id,只读事务的事务id默认为0

判断方法

1.trx_id = creator_trx_id,表示当前事务访问的是自己修改过的纪录可以正常访问

2.trx_id < min_trx_id, 生成该版本的事务在当前事务生成ReadView之前提交

3.trx_id > max_trx_id,生成该本本的事务在当前事务生成ReadView之后开启

4.min < trx_id < max,需要查看trx_id是否在m_ids列表中,不存在就提交了,可以访问,如果在,说明活跃不可访问

4.MVCC小结

READ COMMITTEDREPEATABLE READ在生成ReadView的时候是不一样的

  • READ COMMITED是在每次SELECT之前都生成一个ReadView
  • REPEATABLE READ是在第一次SELECT生成一个ReadView

四、锁

1.解决并发问题的两种方式

锁结构

  • trx_id:锁是哪个事务产生的
  • is_waiting:当前事务是否在等待

事务T1改动了这个纪录,生成锁结构和这个关联,之前这个锁没有被占用,所以is_waiting=false,这个场景获取锁成功

1.读-读 : 读与读之间是不互斥的

2.写-写:写与写之间出现了脏写,这种情况需要加锁,进行锁的获取和释放

3.读-写,写-读:这种会出现脏读,不可重复读,幻读

解决方案

1.MVCC进行控制

我们通过ReadView找到适应的版本(历史版本基于undo日志),只能看到在生成ReadView之前已经提交的事务,之后的更改是看不到的

2.读写操作都加锁

读-写也像写-写那样排队执行

2.一致性读

事务利用MVCC进行的读操作是一致性读,或者叫快照读

普通SELECT(plain SELECT)在READ COMMMITED,REPEATED READ情况下都算一致性读

3.锁定读

1.共享锁和排他锁

要想读-读不受限,又要让读-写,写-读,写-写相互阻塞,于是就设计了S锁和X锁

  • 共享锁:S锁,事务读取纪录之前,需要获取S锁
  • 排他锁:X锁,事务修改记录前,需要获取纪录的X锁

兼容性:

image-20230620201446871

2.锁定读

我们想在读取纪录的时候获取X锁就需要用到锁定读

对读取纪录加S锁:

SELECT ... LOCK IN SHARE MODE

对读取纪录加X锁

SELECT ... FOR UPDATE

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

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

相关文章

(有10个维度为(256,128,130)的tensor,计算10个tensor两两之间的相似性以及差异性,并将相似性和差异性可视化。

有10个维度为&#xff08;256,128,130&#xff09;的tensor&#xff0c;计算10个tensor两两之间的相似性以及差异性&#xff0c;并将相似性和差异性可视化。 问题描述解决办法 问题描述 有10个维度为&#xff08;256,128,130&#xff09;的tensor&#xff0c;计算10个tensor两…

Java基础复习第二天

目录 一、字符串 二、不可变的好处 三、String&#xff0c; StringBuffer and StringBuilder的区别 四、字符串池 五、新字符串&#xff08;“abc”&#xff09; 一、字符串 String 被声明为 final&#xff0c;因此它不可被继承。&#xff08;Integer 等包装类也不能被继承…

前端-基础选择器

从今天开始学习下前端的知识-查漏补缺&#xff0c;仅为自己学习记录使用 基础选择器 标签选择器类选择器id 选择器通配符选择器 标签选择器 标签名 {属性名&#xff1a;属性值; }<style>p {color: red;} </style><p>你好&#xff0c;世界</p>类选择…

Unity URP 获取Camera Stack

URP 获取Camera Stack 1.using UnityEngine.Rendering.Universal; 2.Camera.main.GetUniversalAdditionalCameraData().cameraStack

【日志加载 log4j】

日志 笔记记录 1. 日志介绍2. 日志体系结构3.Log4j开发流程4.Log4j组成4.1 Loggers 记录器4.2 Appenders 输出源4.3 Layouts 布局5. 配置文件 log4j.properties 1. 日志介绍 2. 日志体系结构 3.Log4j开发流程 1.引入依赖<dependency><groupId>log4j</groupId>…

爬虫正常用哪种代理比较好?

在进行网络爬虫时&#xff0c;使用代理可以带来许多好处&#xff0c;包括提高请求的可靠性、防止IP封锁、实现匿名浏览等。以下是一些常见的代理类型&#xff0c;你可以根据需要选择最适合的&#xff1a; 免费代理&#xff1a;免费代理可能数量众多&#xff0c;但质量和稳定性参…

Python获取某品牌加盟数据采集实现可视化数据分析

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 开发环境 : python 3.8 运行代码 pycharm 2022.3 辅助敲代码 jupyter 数据分析使用软件 模块使用 &#xff1a; requests 数据请求模块 需要安装 parsel 数据解析模块 csv pandas pyecharts 第三方模块安装&#xf…

基于Java开发的企业人力资源管理系统(ehr系统)

一、项目介绍 一款全源码可二开&#xff0c;可基于云部署、私有部署的企业级数字化人力资源管理系统&#xff0c;涵盖了招聘、人事、考勤、绩效、社保、酬薪六大模块&#xff0c;解决了从人事招聘到酬薪计算的全周期人力资源管理&#xff0c;符合当下大中小型企业组织架构管理…

BOLD信号的生理建模及其对有效连接的影响

导读 本文提供了BOLD信号生理过程的总体概述(即生成生物物理模型)&#xff0c;包括它们在生理信息动态因果模型(P-DCM)框架下的时间过程特征。BOLD信号主要由顺磁性脱氧血红蛋白的变化决定&#xff0c;而顺磁性脱氧血红蛋白的变化是氧代谢、脑血流量和脑血容量变化共同作用的结…

测试工程师首chatGPT,编写python读取xmind测试用例chatgtp+python+xmind

背景 有用xmind写测试用例的吧&#xff0c;统计一个xmind的条&#xff0c;需要花大量的时间&#xff0c;还有要统计有多少条冒烟的&#xff0c;多少条不通过的&#xff0c;还有通过的条数。 需求 快速使用python&#xff0c;写一个简单的脚本&#xff0c;统计所有xmind节点&…

【IP地址与子网掩码】网络杂谈(19)之IP地址分类与子网掩码的概念

涉及知识点 什么是子网掩码&#xff0c;IP地址的分类&#xff0c;子网掩码的概念&#xff0c;深入了解子网掩码与IP地址,A类&#xff0c;B类&#xff0c;C类&#xff0c;D类&#xff0c;E类ip地址范围。 原创于&#xff1a;CSDN博主-《拄杖盲学轻声码》&#xff0c;更多内容可…

Linux调试笔记

gdb调试----------------------------------------------------------------------------------------- CMakeFile.txt加入set(CMAKE_BUILD_TYPE Debug) gdb ./rknn_MNIST 打断点 b 110/main(行号/函数名) 单步调试 s&#xff08;step&#xff09; 单步跳过 n&#xff08;n…

计算机组成原理(2)_计算机基本组成

计算机组成系列文章目录 第一章 计算机的基本组成 1. 大致简介 2. 计算机基本组成 第二章 计算机的指令和运算 第三章 处理器设计 第四章 存储器和IO系统 文章目录 计算机组成系列文章目录前言参考资料一、组成架构&#xff08;冯/图&#xff09;1. 组成架构2. 冯诺依曼3. 图灵…

力扣 530. 二叉搜索树的最小绝对差 / 783. 二叉搜索树节点最小距离

题目来源 530&#xff1a;https://leetcode.cn/problems/minimum-absolute-difference-in-bst/description/ 783&#xff1a; https://leetcode.cn/problems/minimum-distance-between-bst-nodes/ C题解1&#xff1a;递归法&#xff0c;中序遍历。通过中序遍历将二叉搜索树转…

【Android】Android类加载机制

ClassLoader介绍 任何一个 Java 程序都是由一个或多个 class 文件组成&#xff0c;在程序运行时&#xff0c;需要将 class 文件加载到 JVM 中才可以使用&#xff0c;负责加载这些 class 文件的就是 Java 的类加载机制。ClassLoader 的作用简单来说就是加载 class 文件&#xf…

echarts图表-实现中国地图的绘制

第一步&#xff1a;引入中国地图的json数据&#xff0c;初始化echarts的dom结构&#xff0c;使用registerMap方法加载地图数据&#xff08;注&#xff1a;echarts5.X版本后删除了中国地图的JSON&#xff0c;需自行下载JSON或降低echarts版本&#xff09; 第二步&#xff1a;传输…

React通过props的children实现插槽功能

可能会比较遗憾的说 React中并没有vue中的 slot 插槽概念 不过 可以通过props.children 实现类似功能 我们先创建一个React项目 在src下创建目录components 在下面创建一个dom.jsx组件 参考代码如下 import React from "react" export default class dom extends R…

Android学习日志 一、滚动视图的嵌套

文章目录 滚动视图的嵌套创建项目(前期准备)工程搭建编写XML正式代码 By-Round Moon 滚动视图的嵌套 说明:本博客是博主学习安卓开发的第一个案例。接下来会进行一系列的样例&#xff0c;含很多基础部分&#xff0c;各位观众老爷请见谅。 Android Studio 版本:2022.2.1 patch …

如何将MBR转为GUID?这方法易于使用且安全!

为什么要将MBR转为GUID(GPT)&#xff1f; MBR代表主引导记录&#xff0c;它使用Legacy BIOS分区表。而GPT磁盘&#xff0c;也就是GUID分区表的缩写&#xff0c;是一种引入了统一可扩展固件接口 (UEFI) 的新布局。GPT磁盘有2个主要优势&#xff1a; GPT磁盘每个分区…

前端-CSS 字体和文本样式

字体大小 /* 浏览器默认字体大小 16px */ font-size: 16px;<div style"font-size: 16px;">Hello World!</div> <div style"font-size: 26px;">Hello World!</div>字体粗细 font-weight: 400;<div style"font-weight: no…