InnoDB多版本控制实现

本篇翻译自 MySQL 5.7 Reference Manual / The InnoDB Storage Engine / InnoDB Multi-Versioning,主要讲述的是在InnoDB中多版本控制协议的实现:

InnoDB 是一个多版本控制存储引擎,它记录改变行的历史信息来保证事务的一致性和回滚。这些历史信息保存在表空间的一个叫rollback segment的数据结构,InnoDB利用这个数据结构来完成回滚中的撤销操作,并且为一致性读取建立历史版本。

InnoDB为每行增加了3个区域,6字节的DB_TRX_ID字段指示插入或更新该行的最后一个事务的事务标识符。另外,删除被视为更新操作,其中行中的一个特殊位被设置标记为已删除。每一行还包含一个名为roll pointer的7字节DB_ROLL_PTR字段,roll pointer指向写入rollback segment的undo log记录,如果更新了行,undo log将记录在更新行之前重建该行内容所需的信息。最后是6字节的DB_ROW_ID字段,它记录一个行ID,该行ID随着插入新行而单调递增,如果InnoDB自动生成一个聚集索引,则该索引包含行ID值。否则,DB_ROW_ID不会出现在任何索引中。

rollback segment中的undo log 分为inster undo log和update undo log。inster undo log只在事务回滚中需要,会在事务提交时立即丢弃。update undo log用于保证读取一致性,但他们只能在没有需要update undo log中的信息来保证一致性读取的事务存在的时候才能被丢弃。所以你最好定期提交你的事务,包括哪些只有读取的事务,否则InnoDB不能update undo log,这样一来rollback segment将会越来越大,填满你的表空间。

rollback segment中的undo log的物理大小通常小于相应的插入或更新行。你可以使用此信息来计算rollback segment所需的空间。

在InnoDB多版本控制方案中,当你使用SQL语句删除一行时,它不会立即从数据库的磁盘上删除。InnoDB只有在丢弃为删除而编写的update undo log记录时,才会从磁盘上删除相应的行及其索引记录。这个删除操作称为清除,它非常快,通常使用与执行删除操作的SQL语句相同的时间顺序。

如果在表中以差不多的速度少量的插入和删除行,清除线程可能会开始滞后,由于所有的“死”行,表可能会变得越来越大,这使得所有内容都被磁盘读取速度所限制,以至于速度非常慢。在这种情况下,通过调优innodb_max_purge_lag系统变量,控制新的行操作,并为清除线程分配更多的资源。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值