14.2.2 InnoDB Multi-Versioning InnoDB 多版本:

InnoDB 是一个多版本的存储引擎: 它保留信息关于改变数据的老版本,为了支持事务功能 比如并发和回滚。

这些信息是存储在tablespace 在一个数据结果被称为回滚段(Oracle也有类似的数据结构).

InnoDB 使用的信息在回滚段里执行一个Undo操作需要一个特定的事务回滚。

它也使用信息来创建早期的一致读的版本。

在内部,InnoDB 增加3个字段到每条存储在数据库中的记录。一个 6个字节的DB_TRX_ID 字段

表明事务标识用于上一个事务更新或者插入记录。

此外,一个删除是内部作为一个更新对待 一个特殊的位在记录里是被设置标记为删除。

每行业包含一个7位的字符 DB_ROLL_PTR 字段被称为roll pointer。

roll pointer  指向一个undo log 记录被写入到一个回滚段。

如果记录被更新,undo log 记录包含必要的信息来重建 记录在更新前的内容。

一个 6字节 DB_ROW_ID 字段包含一个row ID 会自动增加作为一个新行被插入。

如果InnoDB 自动产生一个clustered index, index 包含row ID值。

否则 DB_ROW_ID 列不出现在任何索引里。

Undo logs 在回滚段是被划分成Insert和update undo logs.

Insert undo logs 只有在事务回滚时才需要,可以丢弃一旦事务提交。

Update undo logs 是用于一致性读,但是它们被丢弃只有在当前没有事务

InnoDB 已经分配一个快照  在一致性读需要信息在更新undo log 来创建一个早期的数据库记录的版本。

不定期的提交你的事务,包括那些事务只执行一致读。

否则,InnoDB 不能丢弃数据从update undo logs, 回滚段可能会变得很大,填满你的tablespace.

回滚段的物理大小在回滚段是典型的小得相比相应插入或者更改的记录。

你可以使用这个信息来计算你的回滚段需要的东西。

在InnoDB 多版本scheme,一个记录不是立即物理的删除从数据库 当你删除使用一个SQL语句。

InnoDB 只是物理的删除相应的记录和它的索引记录当你丢弃update undo log 记录。

这个操作称为一个purge, 是非常快的,通常花费相同的时间顺序和你的SQL语句 做删除操作一样。

如果 insert 和delete 记录在小批量同样的速率, purge thread 可以启动滞后 

表会变得很大很大,因为有很多dead 记录,让磁盘很慢。

在这种情况下,压制新的记录操作,分配更多的资源来purge thread 通过调整innodb_max_purge_lag  系统变量。

多版本和 Secondary Indexes:

InnoDB 多版本并发控制(MVCC) 对待为第2索引 不同于clustered indexes

记录在clustered index 就地更新, 它们隐藏的系统列指向undo log 条目 早期的版本记录可以被重构

不像 clustered index records,secondary index 不包含隐含的系统列也不在原地更新。

当一个 secondary index列被更新,老的secondary index 记录会被标记为删除,

新的记录会被插入, 标记为删除的记录会被清除。

当一个secondary index 记录是标记为删除或者 the secondary index page 是被更新通过一个新的事务,

InnoDB 查找数据库记录在clustered index. 在clustered index,

记录的DB_TRX_ID 是被检查,相应的记录的正确版本是从undo log 检索如果记录被修改在读取,事务开始.

如果一个secondary index record 被标记为删除或者secondary index page 被更新通过一个新的事务,

 covering index technique没有被使用。

代替返回值从索引结构,InnoDB 查找记录在 clustered index.

然而, 如果index 条件 pushdown (ICP) optimization被启用,

WHERE 条件的部分可以评估使用唯一的域从Index

MySQL server 仍旧pushes WHERE 条件的这部分到存储引擎 ,被评估为使用index.

如果没有匹配记录被发现,   clustered index 查找是被避免。

如果批量的记录被找到, 甚至在标记为删除的记录,InnoDB 查找记录 在clustered index.

14.2.2 InnoDB Multi-Versioning InnoDB 多版本的更多相关文章

  1. 14.8.4 Moving or Copying InnoDB Tables to Another Machine 移动或者拷贝 InnoDB 表到另外机器

    14.8.4 Moving or Copying InnoDB Tables to Another Machine 移动或者拷贝 InnoDB 表到另外机器 这个章节描述技术关于移动或者复制一些或者所 ...

  2. 14.8.1 Creating InnoDB Tables 创建InnoDB 表

    14.8.1 Creating InnoDB Tables 创建InnoDB 表 创建一个InnoDB表,使用CREATE TABLE 语句,你不需要指定ENGINE=InnoDB 子句 如果Inno ...

  3. 14.7.1 Resizing the InnoDB System Tablespace InnoDB 系统表空间大小

    14.7.1 Resizing the InnoDB System Tablespace InnoDB 系统表空间大小 这个章节描述如何增加或者减少 InnoDB 系统表空间的大小 增加InnoDB ...

  4. 14.18.1 The InnoDB Recovery Process InnoDB 恢复进程:

    14.18.1 The InnoDB Recovery Process InnoDB 恢复进程: InnoDB crash recovery 有几个步骤组成: 1.应用redo log,Redo lo ...

  5. 14.1.2 Checking InnoDB Availability 检查InnoDB 可用性:

    14.1.2 Checking InnoDB Availability 检查InnoDB 可用性: 确认你的server 是否支持InnoDB,使用 SHOW ENGINES 语句.(默认MySQL的 ...

  6. 14.6.2 Moving or Copying InnoDB Tables to Another Machine 移动或者copy InnoDB 表到另外的机器

    14.6.2 Moving or Copying InnoDB Tables to Another Machine 移动或者copy InnoDB 表到另外的机器 这个章节描述技术关于移动或者copy ...

  7. 14.6.1 Creating InnoDB Tables 创建InnoDB 表:

    14.6.1 Creating InnoDB Tables 创建InnoDB 表: 创建一个InnoDB 表,使用CREATE TABLE 语句,你不需要指定 ENGINE=InnoDB子句 如果In ...

  8. type=INNODB和engine=INNODB的区别

    我在网站下载了一份源码,学习中, 发现type=INNODB,这个数据库引擎老实出错,,后来才一查资料才是: 在MYSQL5.5及以后版本中type=InnoDB 由ENGINE=InnoDB 代替. ...

  9. InnoDB存储引擎--Innodb Buffer Pool(缓存池)

    InnoDB存储引擎--Innodb Buffer Pool(缓存池) Innodb Buffer Pool的概念 InnoDB的Buffer Pool主要用于缓存用户表和索引数据的数据页面.它是一块 ...

  10. 转:InnoDB Page Structure(InnoDB页面结构详解)

    InnoDB Page Structure(InnoDB页面结构详解) 此转载自登博的博客,给大家分享.

随机推荐

  1. wxWidgets刚開始学习的人导引(4)——wxWidgets学习资料及利用方法指导

    wxWidgets刚開始学习的人导引全文件夹   PDF版及附件下载 1 前言2 下载.安装wxWidgets3 wxWidgets应用程序初体验4 wxWidgets学习资料及利用方法指导5 用wx ...

  2. php - 小型微博系统

    效果: 数据库: 项目结构: add.php : 添加微博. conn.php : 数据库配置文件. delete.php : 删除博客代码. disinfo.php : 显示微博详细信息. inde ...

  3. 【转】增强 scite 编辑器的代码提示功能

    在 windows 下写 Lua, 我能找到的最好的编辑器就是 luaForWindows 项目里带的 scite. npp (即 notepad++ ) 也将就着能用, 不过只有代码高亮和简单的单词 ...

  4. C#利用lambda实现委托事件的挂接

    转自:http://www.cdtarena.com/cpx/201307/9287.html在写一个小程序的时候,碰到了这样的问题,需要用委托来挂接事件,但是又想在这事件中使用局部的变量,而委托一旦 ...

  5. Robot Framework与Web界面自动化测试学习笔记:简单例子

    假设环境已经搭建好了.这里用RIDE( Robot Framework Test Data Editor)工具来编写用例.下面我们对Robot Framework简称rf. 我们先考虑下一个最基本的登 ...

  6. [置顶] think in java interview-高级开发人员面试宝典(八)

    面经出了7套,收到许多读者的Email,有许多人说了,这些基础知识是不是为了后面进一步的”通向架构师的道路“做准备的? 对的,你们没有猜错,就是这样的,我一直在酝酿后面的”通向架构师的道路“如何开章. ...

  7. HTTP协议--状态码

    HTTP状态码负责表示客户端HTTP请求返回的结果.标记服务器端的处理是否正常.通知出现的错误等工作. 常用状态码共分5大类: 1XX:Informational,信息性状态码,接收的请求正在处理. ...

  8. [WCF]WCF起航

    解决方案概览: Client:windows 控制台应用程序. WcfService1: windows 服务应用程序. WCFWebTest:asp.net 空web应用程序. 变量程序命名.结构可 ...

  9. android 设置字体颜色、EditText自己主动输入转换成大写字母的多种方式

    在TextView上面设置某一个字的字体颜色为指定颜色时,能够通过java类SpannableString类和Html语言来实现. (一)SpannableString类方式 private void ...

  10. hdu1370-Biorhythms

    http://acm.hdu.edu.cn/showproblem.php?pid=1370 中国剩余定理 已知(n+d)%23=a;   (n+d)%28=b;   (n+c)%33=i       ...