首页 > 数据库 >【MYSQL】InoDB引擎以及MVCC多版本并发控制【详解】

【MYSQL】InoDB引擎以及MVCC多版本并发控制【详解】

时间:2024-11-14 18:14:36浏览次数:3  
标签:回滚 log MYSQL undo MVCC 操作 InoDB 数据 硬盘

一、逻辑存储架构

                一个表空间对应的一个ibd文件,里面有许多段,其中包括数据段和索引段还有回滚段,在数据存储模型中的B+树中,叶子节点就是数据段进行存储的,非叶子节点就是索引段进行存储的,回滚段里存储了 undo log日志。然后里面还分为区->页->行

二、架构

        1.内存结构

分为Buffer Pool缓冲池,Change Buffer更改缓冲区 Log Buffer 日志缓冲区  Adaptive Hash Index 自适应哈希索引。

             1.缓冲池

                进行增删改查数据直接进行操作缓存池的数据,如果没数据会将硬盘数据刷到内存中,然后如果对数据处理后它不回直接写进硬盘,而是先写到缓冲池,一定时候会写入硬盘中。

                free page空闲page未被使用

                clean page 被使用,数据还没修改过

                dirty page 脏页,被使用被修改过                   对应的块颜色依次变深

              2.更改缓冲区

                它针对于非一级索引的二级索引进行操作的,对于DML操作 后先同步到Buffer Pool再刷到硬盘中,为什么要这样,因为非唯一索引中如果进行随机顺序插入数据,那么节点内的数据可能会发送页分裂操作,这个操作会影响性能因为增加了与硬盘的IO操作。

              3.自适应哈希索引

                提供了一种hash索引结果,这种方式查数据快,但是不支持范围查询,自适应hash索引是系统自动建立的。

              4.日志缓冲区

                用来保存到硬盘中日志数据,定时刷新到硬盘中,例如redo log、undo log

        2.硬盘结构

        3.后台线程

                在一定条件将内存中的数据刷到硬盘中。

三、事务原理

        简单介绍一下ACID,事务的四大特性

      原子性、一致性、持久性是通过redo log 和undo log进行管理的,隔离性通过锁和MVCC控制

        1.redo log

                我们正常在DML操作的时候开启事务进行操作,提交事务后就会将操作的数据刷到内存的缓冲池中,其中如果缓冲池中没数据就会从硬盘中的.ibd文件中读取到数据存到缓冲池中。然后此时已经提交事务,接着在一定时间以后后台线程会将缓冲池的数据刷到硬盘中,但是这个过程如果出错了,那么数据就会丢失。为了解决这个问题,在数据存到缓冲区的时候就记录一个到RedoLog buffer,在事务提交的时候会将RedoLog Buffer里的数据直接存到硬盘里。如果刷新到磁盘中出错了可以通过RedoLog存到硬盘中的 redo log file文件将数据恢复,这个文件不会永久保存定期会清除。该文件里存储的是物理日志。

                        

        2.undo log

                回滚日志,在DML操作的时候出现,保证数据的原子性,提供回滚和MVCC中使用。 它使用的是逻辑日志,每一步的操作进行反向操作存储。如果事务提交了不需要回滚操作了,那么此时还会检查MVCC中是否使用了,不然不会将该文件删除。undo log 存储在段空间的回滚区

四、MVCC多版本并发控制

      

当前读就是读取到最新的版本,快照读是不加锁读取一个特定版本。

        1.隐藏字段

        每个数据实际上都有对应的隐藏字段。如果有主键 DB_ROW_ID不会生成。

         2. undo log版本链

        对应Undo log 如果进行insert操作,那么事务提交了不需要回滚了这个undo log就会删除。

但是如果 进行delete 和update 操作那么失误提交了也不会立即删除 undo log,因为MVCC正在使用。

        

        undo log版本链,就是存储数据的时候先会存储一条记录,如果一个事务对数据进行修改删除一次那么会将之前这个记录存放到undolog里面,此时记录的事务id自增1,然后回滚指针指向版本链中记录的地址,每进行一次修改或者删除操作就会像版本链中加一条记录,并且他们通过回滚指针相连,最下边的是最老的数据,越靠上越新。

        但是如果查询的时候返回具体哪个版本,根据readview来判断

        3.ReadView

m_ids实际就是当前事务id min_trx_id实际就是最小活跃事务ID,max_trx_id就是最大活跃id+1 creator_trx_id显而易见。

        判断是否可以访问对应的版本链依据:

        RC条件下快照读每次都会生成readview

        RR条件下仅在第一次执行快照读生成ReadView

标签:回滚,log,MYSQL,undo,MVCC,操作,InoDB,数据,硬盘
From: https://blog.csdn.net/m0_64022419/article/details/143756532

相关文章

  • 如何使用 MySQL Workbench 自动生成 ER 图、同步更新远程数据库 - MySQL Workbench 使
    https://zhuanlan.zhihu.com/p/438270644       ......
  • MySQL数据库innodb_fast_shutdown参数
    innodb_fast_shutdown是MySQLInnoDB存储引擎的一个配置参数,控制在关闭MySQL服务时InnoDB的关机速度和数据恢复的方式。它有三个值,分别是0、1和2,每个值的作用如下:1.innodb_fast_shutdown=0功能:关闭时不会快速退出。MySQL会执行完全的InnoDB日志回滚过程,即使没......
  • MySQL 数据库操作详解:DDL、DML、DQL 和 DCL
    MySQL数据库操作详解:DDL、DML、DQL和DCL在MySQL数据库中,数据定义语言(DDL)、数据操作语言(DML)、数据查询语言(DQL)和数据控制语言(DCL)是四种基本的数据库操作语言。本文将详细介绍这些语言的定义、常用命令以及如何使用它们来管理和操作数据库。1.数据定义语言(DDL)定义:DDL(DataD......
  • MySQL更新操作
    1.insert语法:insertinto表名(列名1,列名2,)values(值1,值2,);语法2:一次性插入多条记录insertinto表名(列名1,列名2,)values(值1,值2,),(值1,值2,);示例:insertintodept(deptno,dname,loc)values(50,'市场部','南京');insertintodept(deptno,dname)values(60,'开发部')......
  • 科普文:软件架构数据库系列之【MySQL状态参数:open table浅析和[ERROR] Error in accept
    概叙科普文:软件架构数据库系列之【MySQL状态参数:tablecache源码浅析】-CSDN博客MySQL经常会遇到Toomanyopenfiles,MySQL上的open_files_limit和OS层面上设置的openfilelimit有什么关系?源码中也会看到不同的数据结构,TABLE,TABLE_SHARE,跟表是什么关系?MySQLflushtable......
  • Springboot连接MySQL主从集群
    一、maven依赖com.alibabadruid-spring-boot-starter<!--Mysql驱动包--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency>二、nacos配置中心配置spr......
  • mysql 导入SQL文件报错, Specified key was too long; max key length is 767 bytes
    【方案1】一、my.ini文件加入配置,然后重启mysql服务innodb_large_prefix=1二、mysql登陆运行命令登录自己的mysql的方法:1.在D:\ProgramFiles\MySQL\MySQLServer5.7\bin路径下运行命令行,2.登录:mysql-h127.0.0.1-uroot-p然后输入密码3.切换到指定数据库  use数......
  • mysql batch insert 慢的问题排查过程
    1,发现线上的queue入库很慢因为我发现2024-11-1412:24:22.897[][Thread-47]INFO com.hp.nova.runner.Task3NewStructRedisQueueRunner.run[93]:eisrq.getType()======3...............2024-11-1412:25:57.653[][Thread-47]INFO com.hp.nova.runner.Task3NewSt......
  • [Mysql基础] 表的操作
    一、创建表1.1语法CREATETABLEtable_name(field1datatype,field2datatype,field3datatype)characterset字符集collate校验规则engine存储引擎;说明:field表示列名datatype表示列的类型characterset字符集,如果没有指定字符集,则以所在数据库的字......
  • 力扣-Mysql-3252-英超积分榜排名 II(中等)
    一、题目来源3252.英超积分榜排名II-力扣(LeetCode)二、数据表结构表:TeamStats+------------------+---------+|ColumnName|Type|+------------------+---------+|team_id|int||team_name|varchar||matches_played......