MTR全称是Mini-Transaction,顾名思义,可以理解为"最小的事务",MySQL中把对底层页面的一次原子访问的过程称之为一个Mini-Transaction,这里的原子操作,指的是要么全部成功,要么全部失败,不存在中间状态。

MTR主要是被用在写undo log和redo log的场景下的。例如,我们要向一个B+树索引中插入一条记录,此时要么插入成功,要么插入失败,这个过程就可以称为一个MTR过程,这个过程中会产生一组redo log日志,这组日志在做MySQL的崩溃恢复的时候,是一个不可分割的整体。

假如我们有一个事务,事务中包含3条语句,那么MTR的概念图如下:

Mini-Transaction一般遵循三条原则:

1、the fix rules

2、WAL

3、force-log-at-commit

这里我们解释下这三条原则:

1、the fix rules

解释第一条规则之前,我们有必要了解下MySQL中的latch的概念,在MySQL中,latch是一种轻量级的锁,与lock不同,它锁定的时间特别短,在innodb中,latch又可以分为mutex(互斥量)和rwlock(读写锁)2种,它的目的在于保证并发线程操作临界资源的正确性。

理解了latch的概念,我们看看the fix rule规则:

修改一个数据页,需要获得这个数据页的x-latch;

访问一个页是需要获得s-latch或者x-latch;

持有该页的latch直到修改或者访问该页的操作完成才释放

2、WAL

WAL技术想必大家比较熟悉,它是Innodb存储引擎之所以支持崩溃恢复的根本,也就是持久化一个数据页之前,需要将内存中响应的日志页先持久化

3、force-log-at-commit

这条原则比较重要,它是指在事务提交的时候,其产生的所有MTR日志都要刷到持久化设备中,从而保证崩溃恢复的逻辑。

之所以介绍MTR,是为了后续介绍MySQL8.0的redo log 优化做准备,在MySQL5.7中,mtr保证了事务内部操作的原子性。当用户进行操作的时候,会更新数据页,同时写redo log,mtr是redo log的载体,存在每个连接会话的私有变量中。当mtr提交时,会将本地redo log拷贝到全局的log_buffer中,为了保证redo log的有序性,需要加锁来访问log_buffer,这把锁就是上面提到的mutex,在这个锁保护下,除了要将本地日志拷贝到全局buffer,还需要将数据页加入了flush_list,供后台线程刷脏,辅助数据库检查点持续往前推进,所以这个锁在旧版本的MySQL中竞争非常激烈。MySQL8.0将这个问题进行了优化,后面的文章中将着重分析。

时间原因,先到这里吧。

mysql的mtr是指什么_MySQL中MTR的概念相关推荐

  1. mysql什么情况会加意向锁_MySQL中的锁4-插入意向锁和自增锁

    插入意向锁(Insert Intention Lock) 插入意向锁本质上可以看成是一个Gap Lock 普通的Gap Lock 不允许 在 (上一条记录,本记录) 范围内插入数据 插入意向锁Gap ...

  2. mysql截取前几个字符串_mysql中截取指定字符前后的字符串

    使用SUBSTRING_INDEX()函数 substring_index(str,delim,count) str:要处理的字符串 delim:分隔符 count:分隔符计数 例子 取出上述表中数组 ...

  3. mysql创建外键级联更新_MySQL中利用外键实现级联删除、更新

    MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引.在创建索引的时候,可以指定在删除.更新父表时,对子表进行的相应操作 ...

  4. mysql子查询教行子查询_MySQL中列子查询与行子查询操作的学习教程

    MysqL 列子查询及 IN.ANY.SOME 和 ALL 操作符的使用MysqL 列子查询 列子查询是指子查询返回的结果集是 N 行一列,该结果通常来自对表的某个字段查询返回. 一个列子查询的例子如 ...

  5. mysql 两张表合并查询_mysql中的分区表和合并表详解(一个常见知识点)

    分区表是mysql5.1之后的新特性,合并表已经存在很长时间了.这篇文章主要介绍这两个概念以及他们基本的操作. 一.合并表 合并表说实话是一种将要被淘汰的技术,但是掌握了合并表的概念再去看分区表就比较 ...

  6. mysql如何插入图片和视频_mysql中怎样插入图片

    mysql中插入图片的方法:首先要在数据库中建表:然后装载JDBC驱动,建立连接:最后创建Statement接口类,来执行SQL语句即可. mysql中插入图片的方法: 1.首先,先要在数据库中建表. ...

  7. mysql 修改字段类型为字符串_MySQL中字段类型与合理的选择字段类型

    原标题:MySQL中字段类型与合理的选择字段类型 字段类型 数值 MySQL 的数值数据类型可以大致划分为两个类别,一个是 整数,另一个是 浮点数或小数. 许多不同的子类型对这些类别中的每一个都是可用 ...

  8. mysql的视图的名词解释_MySql中的视图的概念及应用

    视图的基本概念 视图是从一个或几个基本表(或者视图)导出的表.它与基本表不同,是一个虚表. 数据库只存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中.所以基本表中的数据发生变化, ...

  9. mysql的float取值范围_MYSQL中支持的数据类型及取值范围

    下表列出了各种数值类型以及它们的允许范围和占用的内存空间. 类型 大小 范围(有符号) 范围(无符号) 用途 TINYINT 1字节 -128~127 0~255 小整数值 SMALLINT 2字节 ...

最新文章

  1. Java开发微信公众号(二)---开启开发者模式,接入微信公众平台开发
  2. linux rpm 安装 卸载软件
  3. zcmu4959: ly的新闹钟(有个点容易忽略)
  4. linux 脚本做成服务,Shell脚本注册到Linux系统服务实例
  5. dell笔记本c语言系统,戴尔dell笔记本电脑U盘重装系统win7教程图解
  6. hive与mysql的数据分区的异同
  7. Loadrunner -27225错误
  8. ubuntu 18.04安装php 7,如何在Ubuntu 18.04和16.04上安装PHP(7.3,7.2和7.0)?
  9. python实现自动打电话软件_python 实现手机自动拨打电话的方法(通话压力测试)
  10. uefi模式下修改Intel网卡MAC地址
  11. 开源的C++静态分析工具
  12. MatplotlibTutorial——Matplotlib的基本使用【Jupiter Notebook代码】
  13. Nvidia Deepstream极致细节:3. Deepstream Python RTSP视频输出显示
  14. echarts x 起始_echarts实现获取datazoom的起始值(包括x轴和y轴)
  15. (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  16. win10 自带截图工具 SnippingTool
  17. Pivoting跳板攻击
  18. 李宏毅DLHLP.10.Voice Conversion.2/2. CycleGAN and starGAN
  19. IoT物联网设备OTA:全量升级和增量升级
  20. 仅记录我的第一次数学建模——葡萄酒的评价

热门文章

  1. Arithmetic图像处理halcon算子持续更新
  2. 【数据结构】——归并排序
  3. 【图像处理】——图像的灰度化处理(Python实现三种方法——最大值法、平均值法、加权均值法、gamma校正)
  4. SDM For Face Alignment 流程介绍及Matlab代码实现之预处理篇
  5. android另类工具,[置顶] android应用程序开发另解及Android SDK工具集的另类用法
  6. csi python 摄像头 树莓派_树莓派之摄像头和人脸识别
  7. sublime插件 TortioseSVN
  8. 关于Dapper - 能否不创建定义表对应类使用
  9. 宣布在日本地区正式发布 Windows Azure
  10. 走马观花:Visual Studio Code Name Orcas Mar07CTP /体验DLINQ