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变成默认 ...
随机推荐
- 单点登录的三种实现方式 转自: https://blog.csdn.net/python_tty/article/details/53113612
单点登录SSO(Single Sign On)说得简单点就是在一个多系统共存的环境下,用户在一处登录后,就不用在其他系统中登录,也就是用户的一次登录能得到其他所有系统的信任.单点登录在大型网站里使用得 ...
- eclipse新建servers时选中tomcat版本后next是灰色的解决
有时在编辑器里删除server后就不能重新new了,因为不能点next. 试了下面的方法,可以用. 1.退出2.到[工程目录下]/.metadata/.plugins/org.eclipse.core ...
- Meanshift均值漂移算法
通俗理解Meanshift均值漂移算法 Meanshift车手?? 漂移?? 秋名山??? 不,不,他是一组算法, 今天我就带大家来了解一下机器学习中的Meanshift均值漂移. Mea ...
- centos6安装oracle11g过程中报错Error in invoking target “install” of makefile ‘/home/oracle/app/oracle/product/11.2.0/dbhome_1/ctx/lib/ins_ctx.mk’
报这个错误的原因是由于缺少compat_libstdc包所导致.安装即可 1.在http://www.rpm-find.net/linux/rpm2html/search.php?query=comp ...
- 使用VS+OpenCV调用深度学习模型
最近项目有个任务,要在windows环境下用VS+OpenCV实现caffe模型的调用,于是在网上找了几个相关的博客跑了几个demo练练手.这些博客写得都很详细,但是有些细节由于版本更新的问题,配置的 ...
- 去除最后一个li的样式
推荐::::方法一,使用:first-child 纯css的:first-child伪类就可以胜任此任务,操作很方便,代码量忽略不计.支持IE7+,不支持IE6 :first-child /:l ...
- HDU 4609 3-idiots (组合数学 + FFT)
题意:给定 n 条边,问随机选出 3 条边,能组成三角形的概率是多少. 析:答案很明显就是 能组成三角形的种数 / (C(n, 3)).现在的问题是怎么求能组成三角形的种数. 这个博客说的非常清楚了 ...
- linux 环境统配
#java JAVA_HOME=/opt/jdk CLASSPATH=$JAVA_HOME/lib/ PATH=$PATH:$JAVA_HOME/bin export PATH JAVA_HOME C ...
- MySQL数据库(四)多表查询
两张假设有两张表格A和B,把表格当作一个集合,那么表格中的记录就是集合中的一个元素. 两张表格如下: TableA:TableB: 2.1 内连接(只有一种场景) inner join 或者join( ...
- shell脚本颜色输出(实例未编辑)
颜色输出通过echo 输出,需要加-e echo -e "\033[背景颜色;字体颜色\033[0m" 背景颜色 40 设置黑色背景 41 设置红色背景 42 设置绿色背景 43 ...