大白话讲解MySQL 索引,页分裂,行溢出,事务

news2025/7/9 0:24:18

目录

一、索引

索引是什么,页分裂

页的结构

mysql怎么查询数据

二、页合并

三、行溢出

四、事务

事务四大特性

1、原子性

2、一致性

3、隔离性

4、持久性

事务隔离级别

隔离级别导致的问题

隔离级别与锁的关系

锁与快照读、当前读的关系

RR快照读与RC快照读

MVCC机制——多版本并发控制机制

undo log

 read view

举例


一、索引

图1
图1

索引是什么,页分裂

MySQL b树与b+树,mysql索引等与数据的关系、命中多个索引走哪一个、为什么不建议is_del建索引_qq_41369135的博客-CSDN博客

页的结构

图2

mysql怎么查询数据

如在图1中查询id为10的数据,首先会找到页1,通过二分查找,定位到10在1-18之间。此时就找id=1的指针p1指向所在的第二层页2(为什么找1而不找18,是因为第一层的所有id指向的各自第二层页中都是最小的id,所以10必定在p1指针指向的页2,而不是p2指向的页3),再根据二分查找定位到10在页2的8-14之间,根据刚才的定理,10一定在8指向的页中。所以找到页6,注意。此时并不是直接去遍历user Record里的记录,而是去page directory二分查找,找到对应的槽位,遍历槽位之间的数据找到10(如user Record存放了1-100的数据,page directory存放的是[1,20,50,80,100],通过二分查找,得到10在1-20这个槽位。再遍历1-20找到10。)

二、页合并

InnoDB中的页合并与分裂 - 知乎

三、行溢出

Mysql之大字段溢出问题_jannals的博客-CSDN博客

四、事务

事务四大特性

1、原子性

事务的原子性是指事务必须是一个原子的操作序列单元。事务中包含的各项操作在一次执行过程中,只允许出现两种状态之一,要么都成功,要么都失败

任何一项操作都会导致整个事务的失败,同时其它已经被执行的操作都将被撤销并回滚,只有所有的操作全部成功,整个事务才算是成功完成

2、一致性

事务的一致性是指事务的执行不能破坏数据库数据的完整性和一致性,一个事务在执行之前和执行之后,数据库都必须处以一致性状态。

比如:如果从A账户转账到B账户,不可能因为A账户扣了钱,而B账户没有加钱

3、隔离性

事务的隔离性是指在并发环境中,并发的事务是互相隔离的,一个事务的执行不能被其它事务干扰。也就是说,不同的事务并发操作相同的数据时,每个事务都有各自完整的数据空间。

一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务是不能互相干扰的

4、持久性

事务的持久性是指事务一旦提交后,数据库中的数据必须被永久的保存下来。即使服务器系统崩溃或服务器宕机等故障。只要数据库重新启动,那么一定能够将其恢复到事务成功结束后的状态

在事物进行过程中,未结束之前,DML语句是不会更改底层数据,只是将历史操作记录一下,在内存中完成记录。只有在事物结束的时候,而且是成功的结束的时候,才会修改底层硬盘文件中的数据(这里就是指mysql刷盘机制了

事务隔离级别

读未提交:事务A能看到事务B修改但还没提交的数据。可能会导致脏读、不可重复度、幻读

读已提交:事务A只能看见事务B修改并提交事务后数据(解决了脏读,因为当事务B在对id=1的数据修改时,会对这行数据加排他锁,在事务B没提交之前,其他数据都不能读取该数据)。可能会导致不可重复读、幻读

可重复读:再事务A里多次读取到id=1的数据是一样的,不管其他事务这条数据进行了怎样的修改。可能会导致幻读

串行化:对于同一行记录,写会加“写锁”,读会加“读锁”,当出现锁冲突时,后访问的事务需要等前一个事务执行完成,才能继续执行。

隔离级别导致的问题

脏读:主要针对已存在的数据。举例场景(读未提交):事务A得到id=1的数据,并进行了修改。此时进来一个事务B,得到A修改后确没有提交事务的d=1的数据,并进行了其他操作,事务A报错回滚。那此时事务B读到的数据就是脏数据

不可重复读:主要针对已存在的数据。举例场景(读已提交):事务A得到id=1的数据,此时进来一个事务B,也得到id=1的数据,并进行修改,提交事务。此时数据库的真实数据已经被修改了。事务A再次查询id=1的数据,发现在同一个事务里(事务A)两次查询得到的数据不一致,导致该条数据不可重复读。同理:读未提交场景也是一样。

幻读:主要针对新增数据。举例场景(可重复读):幻读,并不是说两次读取获取的结果集不同,幻读侧重的方面是某一次的 select 操作得到的结果所表征的数据状态无法支撑后续的业务操作。更为具体一些:事务A查询某条记录是否存在,不存在,准备插入此记录,但执行 insert 时发现此记录已存在(因为事务B悄悄的插入了),无法插入,此时就发生了幻读。

隔离级别与锁的关系

mysql隔离级别与锁_像你这样的的博客-CSDN博客_mysql隔离级别与锁

锁与快照读、当前读的关系

S 锁与 X 锁,当前读与快照读! - 简书

RR快照读与RC快照读

因为我们在平时在写select查询语句时都是普通读,基本很少加锁(for update )。普通读在不同隔离级别就引出了两种读的方式:在RU与串行化是都是当前读(读取最新的),在RR与RC是快照读。但在RC中的快照读的效果确是相当于当前读(原因听下面的分解)

RR快照:业务层方法中第一次普通读(select查询)就会对当前查询记录生成快照,也只会生成一次快照。(注:update/insert/delete等语句虽然都有查询,但都是当前读不会生成readView)

RC快照:每此执行普通读都会生成新的快照

MVCC机制——多版本并发控制机制

  1. RC、RR里用到了MVCC机制,MVCC主要由undo log和read view实现
  2. 首先我们要清楚数据库的每条记录都有三个主要隐藏字段。row_id、trx_id、db_roll_ptr

        row_id:当我们没有显示指定主键,那row_id就是数据库默认主键

        trx_id:插入或更新这条记录时的事务id

        db_roll_ptr:回滚时更新前的那条记录的地址,插入时,该条记录的这个字段为null,因为没得历史记录

undo log

undo log分成insert undolog和update undoLog(delete也算update undolog)

insert undolog:只有在回滚时需要。在事务提交完就删除(这个很好理解:比如事务A执行select普通查询,生成readview(快照),此时进来个事务B,事务B执行insert操作,并且commit提交,立马删除事务 B 该条记录的undolog。事务A再次执行select普通查询,如果是mysql是RC隔离级别,就会重新生成readView会把新插入的记录读取出来,如果是RR隔离级别,)

(原因下面readView讲完举例)

update undolog:回滚时和快照读都需要,事务提交后不能立马删,等待mysql的purge线程删。

(原因下面readView讲完举例)

历史数据再udno log里是什么样的?

图3

 read view

我们先看看 ReadView 的几个重要属性

  • trx_ids: 当前系统中那些活跃(未提交)的读写事务ID, 它数据结构为一个List。(重点注意:这里的trx_ids中的活跃事务,不包括当前事务自己和已提交的事务,这点非常重要)

  • low_limit_id: 目前出现过的最大的事务ID+1,即下一个将被分配的事务ID。

  • up_limit_id: 活跃事务列表trx_ids中最小的事务ID,如果trx_ids为空,则up_limit_id 为 low_limit_id。

  • creator_trx_id: 表示生成该 ReadView 的事务的 事务id

访问某条记录的时候如何判断该记录是否可见,具体规则如下:

  • 如果被访问版本的 事务ID = creator_trx_id,那么表示当前事务访问的是自己修改过的记录,那么该版本对当前事务可见;
  • 如果被访问版本的 事务ID < up_limit_id,那么表示生成该版本的事务在当前事务生成 ReadView 前已经提交,所以该版本可以被当前事务访问。
  • 如果被访问版本的 事务ID >= low_limit_id 值,那么表示生成该版本的事务在当前事务生成 ReadView 后才开启,所以该版本不可以被当前事务访问。
  • 如果被访问版本的 事务ID在 up_limit_id和m_low_limit_id 之间,那就需要判断一下版本的事务ID是不是在 trx_ids 列表中,如果在,说明创建 ReadView 时生成该版本的事务还是活跃的,该版本不可以被访问;
    如果不在,说明创建 ReadView 时生成该版本的事务已经被提交,该版本可以被访问。

举例

1、insert undo log为什么commit之后就可以删?(假如此时数据库维护的待分配的最大事务id=457)

RC下:事务A执行select,生成read view(trx_ids=null,low_limit_id=457,up_limit_id=457)。事务B 进场,执行insert并commit(由于执行了增删改操作,mysql给事务事务id=457,同时mysql自身维护全局事务id+1=458),事务A再次select,生成新的read view(此时属性发变化,trx_ids=null,low_limit_id=458,up_limit_id=458)。事务B刚才新插入的那条记录的trx_id=457。根据mvcc可见性机制,事务ID < up_limit_id(457<458),该条记录可见。这证明了两个事,一:事务A查看事务B 插入的记录时,根本没去undo  log里找数据,所以undo log可删,二:正时因为RC下每次select都重新生成read view机制,实现读已提交

RR下:事务A执行select,生成read view(trx_ids=null,low_limit_id=457,up_limit_id=457)。事务B 进场,执行insert并commit(由于执行了增删改操作,mysql给事务事务id=457,同时mysql自身维护全局事务id+1=458),事务A再次select,不会生成新的read view(此时属性还是第一次select时样子,trx_ids=null,low_limit_id=457,up_limit_id=457)。事务B刚才新插入的那条记录的trx_id=457。根据mvcc可见性机制,事务ID >= low_limit_id (457>=457),该条记录不可见。这证明了两个事,一:事务A查看事务B 插入的记录时,根本没去undo  log里找数据,所以undo log可删,二:正时因为RR下的只有第一次select才生成read view机制,实现可重复读

总结:通过上面两个例子发现,在RC,RR中,针对insert操作产生undo log,RC,RR都快照读都没用上,所以MySQL索性就直接删了。

2、update/delete undo log为什么commit之后就不可以删?(假如此时数据库维护的待分配的最大事务id=457)

RR下:事务A执行select,生成read view(trx_ids=null,low_limit_id=457,up_limit_id=457)。事务B 进场,对某条记录执行update并commit(由于执行了增删改操作,mysql给事务事务id=457,同时mysql自身维护全局事务id+1=458),事务A再次select,不会生成新的read view(属性还是老样子,trx_ids=null,low_limit_id=457,up_limit_id=457)。事务B刚才更新的那条记录的trx_id=457。根据mvcc可见性机制,事务ID >= low_limit_id (457>=457),该条记录不可见。此时情况就来了,如果这条记录不可见,事务A就会根据这条记录上的roll_ptr去undo log找对应的记录。针对update、insert操作。如果事务B  commit就删undo log,此时事务A去undo log中时找不到历史数据的,这不满足RR的可重复读条件

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

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

相关文章

网页信息采集-网页数据采集方法

随着社会不停的发展。人们也是越来越离不开互联网&#xff0c;今天小编就给大家盘点一下免费的网页信息采集&#xff0c;只需要点几下鼠标就能轻松爬取数据&#xff0c;不管是导出excel还是自动发布到网站都支持。详细参考图片一、二、三、四&#xff01; 企业人员 通过爬取动…

[附源码]计算机毕业设计JAVA创意众筹网站

[附源码]计算机毕业设计JAVA创意众筹网站 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis M…

JavaScript历史上的今天是星期几

前言 &#x1f44f;这个案例有很多点是我之前不知道的&#xff08;因为是小白&#xff09;&#xff0c;所以很值得学习&#xff0c; ✍编程不是打字机&#xff0c;⭐争取明白每个细节&#xff0c;并努力做的更好 步骤 1.html布局&#xff0c;一个下拉菜单&#xff08;如图&…

独家巨献!阿里专家兼Github贡献者业“大师级Dubbo实战笔记”入门到成神

Apache Dubbo是一款RPC服务开发框架&#xff0c;那何为RPC呢&#xff1f;全称为Remote Procedure Call&#xff0c;翻译过来就是远程过程调用。 使用 Dubbo 开发的微服务原生具备相互之间的远程地址发现与通信能力&#xff0c; 利用 Dubbo 提供的丰富服务治理特性&#xff0c;可…

ZYNQ使用AXI4-HP接口总线读取DDR中的数据

一、前言 最近笔者在做项目的时候需要使用zynq中的AXI4-HP总线在PL端读取DDR中的数据这种功能&#xff0c;但是网上很多历程对于这方面只是创建了一个官方提供的IP核用于测试&#xff0c;并且每次写入和读取的长度为4K字节。所以为了满足我自己的项目需求&#xff0c;笔者将官…

电脑桌面图标不见了怎么回事?正确的找回图标的2个方案

最近遇到很多用户朋友说自己的电脑桌面图标不见了&#xff0c;觉得很奇怪。用户以为是系统原因造成的。电脑桌面图标不见了怎么回事&#xff1f;图标删除了怎么办&#xff1f;这篇文章就给大家分享如何找回电脑桌面消失的图标&#xff0c;一起来看看吧&#xff01; 一、找回电脑…

DTPA PEG 异硫氰酸荧光素,DTPA PEG FITC,FITC-PEG-DTPA

产品名称&#xff1a;DTPA PEG 异硫氰酸荧光素 英文名称&#xff1a;DTPA PEG FITC&#xff0c;FITC-PEG-DTPA CAS&#xff1a;668-000-2 产地&#xff1a;西安 规格&#xff1a;1mg 5mg 10mg 纯度&#xff1a;99% 厂家&#xff1a;西安齐岳生物科技有限公司 用途&#…

arthas的监控java性能

目录1 arthas简介2 arthas下载3 arthas的使用3.1 arthas启动3.2 常用命令3.2.1 dashboard3.2.2 thread3.2.3 jad3.2.4 watch3.2.5 getstatic3.2.6 heapdump3.2.6.1 dump到指定的文件3.2.6.2 dump live 对象3.2.6.3 dump 到临时文件3.2.7 jvm3.2.8 logger3.2.9 mbean3.2.9.1 列出…

Baklib|我的企业是不是需要一个维基页面呢?

你很可能已经听说过维基百科。事实上&#xff0c;我们大多数人几乎每天都在使用维基百科来获取有关历史事件、名人或世界各地的有用信息。但是你知道公司也可以创建和维护他们自己的wiki页面吗? 随着时间的推移&#xff0c;公司会积累大量的信息。如果没有一个好的方法来存储…

Java:为什么要更新Java应用程序?

27年来&#xff0c;Java一直是企业软件开发中最流行的编程语言之一。世界上无数的系统都是使用这种广为人知的语言构建的。 传统的Java应用程序是独一无二的。它们的包中包含了运行应用程序所需的一切&#xff0c;但整体性使得开发人员在进行更改时很难保持敏捷。开发人员必须从…

项目实战——实现注册与登录模块(结尾)

目录 一、整体框架 二、前端页面授权 三、实现注册页面 四、实现登录状态的持久化 一、整体框架 二、前端页面授权 当我们登录网站的时候&#xff0c;如果没有登录&#xff0c;强制让用户重定向到 登录界面 在 router 目录下的 index.js 文件下实现。 router -> index.js…

DIVFusion:首个耦合互促低光增强图像融合的框架

DIVFusion:首个耦合互促低光增强&图像融合的框架DIVFusion:首个耦合互促低光增强&图像融合的框架写在前面问题引入Motivation主要贡献网络架构实验验证融合性能目标检测性能消融实验结论写在最后DIVFusion:首个耦合互促低光增强&图像融合的框架 论文&#xff1a;h…

攻防世界Running

Running 题目描述&#xff1a;无 题目环境&#xff1a;https://download.csdn.net/download/m0_59188912/87016663 一个可执行文件&#xff0c;执行后显示error&#xff0c;尝试binwalk文件分离。 命令&#xff1a;binwalk -e run.exe浏览分离出来的文件。 末尾发现一个run.ex…

mannose-CHO|甘露糖-醛基|甘露糖-聚乙二醇-醛基|醛基-PEG-甘露糖

mannose-CHO|甘露糖-醛基|甘露糖-聚乙二醇-醛基|醛基-PEG-甘露糖 羰基中的一个共价键跟氢原子相连而组成的一价原子团&#xff0c;叫做醛基&#xff0c;醛基结构简式是-CHO&#xff0c;醛基是亲水基团&#xff0c;因此有醛基的有机物&#xff08;如乙醛等&#xff09;有一定的…

APS高级排产软件在快消品行业的应用

快消行业是指消费频率高、使用时限短、拥有广泛的消费群体、对于消费的便利性要求很高的商品销售行业。快消行业的销售渠道种类多而复杂&#xff0c;传统业态和新兴业态等多种渠道并存。快消行业集中度逐步上升&#xff0c;竞争度加大。 随着快速消费品市场的复苏&#xff0c;经…

CNN学习笔记

目录 如何理解卷积层和池化层&#xff1f; 机器视角&#xff1a;长文揭秘图像处理和卷积神经网络架构 卷积神经网络 - 基础知识 激活函数的作用是什么&#xff1f; 激活函数&#xff08;加入非线性因素&#xff09; 提高模型鲁棒性&#xff08;抗干扰能力&#xff09;&#…

时间复杂度和空间复杂度详解

文章目录 引入 一、时间复杂度的详解及例题 1、时间复杂度的概念 2、时间复杂度的例题训练 2.1 实题训练1 2.2 实题训练2 2.3 实题训练3 2.4 实题训练4 2.5 大O符号&#xff08;Big O notation)的函数绘图 二、空间复杂度的详解及例题 1、空间复杂的的概念 2、空间复杂度…

Java注解与原理分析

使用的太多&#xff0c;被忽略的理所当然&#xff1b; 一、注解基础 注解即标注与解析&#xff0c;在Java的代码工程中&#xff0c;注解的使用几乎是无处不在&#xff0c;甚至多到被忽视&#xff1b; 无论是在JDK源码或者框架组件&#xff0c;都在使用注解能力完成各种识别和…

【Vue】url拼接参数获取解析

前言&#xff1a; 前端在开发的时候有很多情况下需要提供不带参数的链接或者带参数的链接给自己使用或者给第三方系统&#xff0c;如果提供给第三方系统使用的话一般是第三方需要通过iframe/window.open/a标签打开链接进入对应的页面。 情况一&#xff1a;获取当前浏览器地址栏…

【React二】ref与事件处理与生命周期钩子函数

关于react基础及组件化编程的可以参考本篇笔记 文章目录一、 React中的事件处理1-1 例子&#xff1a; 不要过度使用ref1-2 受控组件与非受控组件1-2-1 受控组件1-2-2 非受控组件1-3 高阶函数1-3-1 函数的柯里化1-3-2 不用柯里化的写法二、生命周期2-1 引出生命周期2-2 组件生命…