您的位置:首页 > 数据库 > MySQL

mysql官方文档阅读笔记 MVCC

2016-02-04 10:38 776 查看

InnoDB Multi-Versioning

Innodb是一个多版本的存储引擎:它能够保存事务未提交前的数据,用于支持事务的并发操作和回滚。这些信息都被存储在系统表空间的回滚段中(rollback segment)。这个回滚段主要实现两个功能,一是实现事务的回滚操作,另外一个就是一致性非锁定读了。

Internal Details of Multi-Versioning

在内部实现中,innodb通过在每一行记录上添加了三个隐藏列实现。其中一个6字节的DB_TRX_ID作为事务ID标识,用来标记最近一个事务在该行上的insert或者update的情况。DB_TRX_ID中还有一个删除标识位,用来显示该行是否被删除(也就是逻辑删除的概念,innodb并不会真正去物理删除某条记录)。另外每一行还有一个7字节的DB_ROLL_PTR列,可称之为回滚指针。这个回滚指针指向了写到rollback segment中的undo
log的一条记录。如果该数据行被修改,那么这个undo log里的该条记录会在行记录被修改前重建,即保存的将是数据修改前的记录。另外行数据insert时,还会产生一个6字节的单调自增的DB_ROW_ID列。如果innodb自动地产生聚集索引的话(也就是没有显示指定primary),这个自动产生的聚集索引的值就是DB_ROW_ID的内容,否则的话DB_ROW_ID值无意义。

回滚段中的undo log可以分为insert undo log和update undo log两种,它们在存储上实际上是分离开的。Insert undo log一般只用于事务回滚,只要事务一提交后可以立马删除。Update undo log除了事务的回滚外,还用于非锁定读。当innodb分配了一个一致性的快照读时,它就需要update undo log里面的信息来建立一个较早的行版本,所以只有当前没有任何事务需要对改行记录进行快照读时,它才可以被删除,而不是事务一提交就删除(因为可能事务提交了,但是当前的其他session的快照读还没执行完)

Guidelines for Managing Rollback Segments

1 正常地去提交事务,包括非锁定的一致性读。因为innodb无法及时删除update undo log,将会导致回滚段越来越大,甚至占据绝大部分系统表空间。

2 分配好合理的rollback segment大小。比较典型的,undo log占据的物理空间应该小于当前数量相当的insert或者update的行数量所需的空间

3 innodb中,当你执行一条delete语句后,行记录并不会立马被物理删除。Innodb只有在它删除了对应的update undo log之后,它才会实际去物理删除该行记录和它的索引记录,这被称之为purge,不过purge通常很快,速度相当于delete sql执行的时间。

4 If you insert and delete rows insmallish batches at about the same rate in the table, the purge thread canstart to lag behind and the table can grow bigger and bigger because of all the“dead” rows,making everything disk-bound
and very slow. In such a case,throttle new row operations, and allocate more resources to the purge thread bytuning the innodb_max_purge_lagsystem variable.

不是很理解上面的这段话,个人理解就是如果频繁地在一个表的某一块区间内以相同的速率insert和delete,会引起purge线程落后,从而导致db达到磁盘瓶颈,这时候可以通过调整innodb_max_purge_lag这个系统参数来缓解。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: