InnoDB多版本
InnoDB是一个多版本的存储引擎:为了支持事务的一些特性诸如并发和回滚,它保持着被修改行的旧版本信息。这些信息被存储在一个被叫做“回滚段”的表空间中(跟Oracle中的回滚段类似)。InnoDB在回滚段中用这些信息来执行undo操作,以此支持事务回滚。它也用这些信息来构造行的更早的版本,以此支持一致性读。
在内部,InnoDB为数据库中存储的每一行添加三个字段。一个6字节的DB_TRX_ID字段来表示插入或者修改这一行的最后一个事务的事务标示符。delete在内部被当做update来对待,就是在行的特定位做一个标记,以表明这一行已经被删除。每一行还包含一个被叫做“roll pointer”的7字节的DB_ROLL_PTR字段。这个roll pointer被指向一个写在回滚段中的undo log。如果行被修改了,那么这个undo log记录包含的信息必须先于行修改被重新修改。一个6字节的DB_ROW_ID字段包含一个当行被插入的时候单调递增的行ID。如果InnoDB自动生成了一个聚集索引,那么这个索引包含行ID值,否则DB_ROW_ID列不会出现在任何索引中。
回滚段中的undo logs被划分为insert undo logs和update undo logs。insert undo logs只有在事务回滚的时候才会用到它,并且在事务提交以后它就被丢弃了。update undo logs用在一致性读的时候。
定期提交你的事务,包括哪些只有一致性读的事务。否则,InnoDB不能从update undo logs中丢弃数据,并且回滚段可能会增长得很大,填满你的表空间。
在InnoDB多版本中,当你用SQL语句删除的时候,这一行并不是立即从数据库中被物理删除。只有当它为了删除丢弃了update undo logs的时候,InnoDB才会物理删除这一行和它的索引记录。这种删除操作被叫做purge,并且它的速度相当快
Multi-Versioning and Secondary Indexes
InnoDB多版本并发控制(MVVC)对待二级索引和聚集索引时不同的。一条记录的聚集索引在原地被更新,它们的执行undo log的隐藏系统列会被重新构造。不像聚集索引记录那样,二级索引记录不包含隐藏的系统列,它们也不会在原地被更新。
当一个二级索引记录被更新的时候,旧的二级索引记录被标记为删除,新的索引记录被插入,并且被标记为删除的索引记录最终被purge。当一个二级索引记录被标记为删除或者二级索引页被一个新的事务更新的时候,InnoDB用聚集索引查找数据库记录。在聚集索引中,记录的DB_TRX_ID字段被检查,并且记录的正确版本会被从undo log中检索出来,即使记录在事务初始读取以后被修改。
小结:
1、InnoDB在回滚段中维护着被修改行的旧的版本信息
2、回滚段中的undo logs分为insert undo logs和update undo logs。并且undo log 日志写入优先。
3、在内部,delete被当做update来对待。它是将旧的行标记为删除,然后插入新的行.
4、当在SQL语句执行DELETE的时候并不是立即从数据库中删除这条记录。只有当它丢弃update undo logs的时候,该记录及其索引记录才会被物理删除。
5、InnoDB给数据库中的每一行记录添加三个字段
- DB_TRX_ID:表明插入或者修改这一行的最后一个事务的事务标识符
- DB_ROLL_PTR:指向回滚段中的一个undo log记录
- DB_ROW_ID:单调递增的行ID。(PS:如果没有明确定义聚集索引,那么会自动生成一个聚集索引,这个时候自动生成的聚集索引的值就是DB_ROW_ID)
6、MVCC下的二级索引和集聚索引时不同的。二级索引记录既不包含隐藏的系统列,也不会在原位置被更新。与之相反,聚集索引记录才会包含隐藏的指向undo log记录的系统列,而且聚集索引时在原来位置上被更新的。
7、当一个二级索引列被更新的时候,旧的二级索引记录被标记为删除,同时插入一个新的二级索引记录。
8、由此可见,undo logs中不仅包含记录的undo log还包含索引记录的undo log。
参考 https://dev.mysql.com/doc/refman/5.7/en/innodb-multi-versioning.html
InnoDB多版本的更多相关文章
- 14.3 InnoDB Multi-Versioning InnoDB 多版本
14.3 InnoDB Multi-Versioning InnoDB 多版本 InnoDB 是一个多版本的存储引擎,它保持信息关于改变的数据老版本的信息, 为了支持事务功能比如并发和回滚. 这些信息 ...
- 14.2.2 InnoDB Multi-Versioning InnoDB 多版本
14.2.2 InnoDB Multi-Versioning InnoDB 多版本: InnoDB 是一个多版本的存储引擎: 它保留信息关于改变数据的老版本,为了支持事务功能 比如并发和回滚. 这些信 ...
- Mysql加锁过程详解(5)-innodb 多版本并发控制原理详解
Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...
- 转:InnoDB多版本(MVCC)实现简要分析
InnoDB多版本(MVCC)实现简要分析 基本知识 假设对于多版本(MVCC)的基础知识,有所了解.InnoDB为了实现多版本的一致读,采用的是基于回滚段的协议. 行结构 InnoDB表数据的组织方 ...
- InnoDB多版本(MVCC)实现简要分析(转载)
http://hedengcheng.com/?p=148 基本知识 假设对于多版本(MVCC)的基础知识,有所了解.InnoDB为了实现多版本的一致读,采用的是基于回滚段的协议. 行结构 InnoD ...
- (转)innodb 多版本并发控制原理详解
转自:https://blog.csdn.net/aoxida/article/details/50689619 多版本并发控制技术已经被广泛运用于各大数据库系统中,如Oracle,MS SQL Se ...
- InnoDB多版本(MVCC)实现简要分析
转载自:http://hedengcheng.com/?p=148 基本知识 假设对于多版本(MVCC)的基础知识,有所了解.InnoDB为了实现多版本的一致读,采用的是基于回滚段的协议. 行结构 I ...
- Mysql InnoDB多版本并发控制MVCC
参考书籍<mysql是怎样运行的> 系列文章目录和关于我 一丶为什么需要事务隔离级别 mysql是一个客户端/服务断软件,对于同一个服务器来说,可以有多个客户端进行连接,每一个客户端进行连 ...
- [MySQL Reference Manual]14 InnoDB存储引擎
14 InnoDB存储引擎 14 InnoDB存储引擎 14.1 InnoDB说明 14.1.1 InnoDB作为默认存储引擎 14.1.1.1 存储引擎的趋势 14.1.1.2 InnoDB变成默认 ...
随机推荐
- shell脚本学习-练习写一个脚本1
# 1.依次展示/etc/passwd中的用户名和UID.格式如:Hello,$USER,your UID is $UID. # 2.统计一个有多少个用户 #!/bin/bash #Program D ...
- SRILM的使用及平滑方法说明
1.简介 SRILM是通过统计方法构建语言模型,主要应用于语音识别,文本标注和切分,以及机器翻译等. SRILM支持语言模型的训练和评测,通过训练数据得到语言模型,其中包括最大似然估计及相应的平滑算法 ...
- union: git command
# switch one tag # warning: if do that, can't commit any change git clone $project_path git checkout ...
- Dom4j 封装DOM和SAX 的方法
Dom4j 封装DOM的解析XML文件的方法: List<Book> bookList=new ArrayList<Book>(); //1.1 建立一个解析器工厂: Docu ...
- GitHub学习途径
之前学习GitHub的一个pdf文件 作者是stormzhang 我觉得那个pdf教的很详细,我还没看完,正在学习中,学到了文件的clon和在本机如何更新GitHub的文件. 在此分享一下 下载链接h ...
- windows10系统安装Oralce11g时遇到INS-13001环境不满足最低要求
升级win10系统之后,需要重新安装Oracle,因为在安装Oralce11g时,使用64位的会出现各种不兼容问题,我每次安装都是使用32位的数据库. 在安装时点击setup.exe之后,出现了:[I ...
- Python3学习(1)——初步了解
Python是解析性语言,Python解释器将源程序解释并执行. 基本语法 print() --打印字符串 -直接打印 print("hello world") 结果: hel ...
- SSH通过密钥登陆
A服务器上操作 ssh-keygen -t rsa/dsa 后面所带参数rsa/dsa为加密方式,默认为dsa [root@localhost ~]# ssh-keygen Generating pu ...
- win7 ssh linux虚拟机(ubuntu12.04)
环境: 1. 管理vmware Workstation8.0 2. Ubuntu 12.04.iso安装文件 3.Ssh登录软件putty 步骤 1.安装,安装linux系统时,在“硬件”里设置“网络 ...
- 携带cookie的跨域访问
携带cookie的跨域解决方案 有的时候访问后台的请求需要携带cookie以供后台分析,比如jQuery的ajax请求: $.ajax({ url: a_cross_domain_url, xhrFi ...