Mysql学习——关于InnoDB(Multi-Versioning)

2017-01-05 11:17:50来源:oschina作者:K袁人点击

InnoDB是一个多重版本引擎:它会保留那些被修改行的旧的版本信息来支持事务的并发和回滚功能。这些信息以回滚段(rollback segment)的数据结构存储在表空间中。当事务回滚时,InnoDB就用这些回滚段的信息来执行undo操作。这些信息也可以重新构造更早版本的数据已便用来一致性读。


在内部,InnoDB会为没一行添加3个字段。一个6-byte的DB_TRX_ID字段用来标识最后一个insert或者update该行的事务。同样的,delete是被当做为一个update操作,更新其中1个标志位为delete。每一行也包含一个7-byte的DB_ROLL_PTR字段,这个字段被称为roll pointer(回滚指针)。这个roll pointer指向写入undo log中的回滚段记录。如果记录被更新了,undo log就已经包含了必要的信息去重做记录。一个6-byte的DB_ROW_ID字段包含一个row ID(递增),当新数据插入时。如果InnoDB自动生成了一个聚簇索引,索引包含这个row ID。除此之外,任何索引都不包含这个row ID。


rollback segment中的undo log可以分为两类,一类是insert,一类是update。insert undo log仅仅只在事务回滚时需要,一旦commit则丢弃掉这类undo log。 update undo log则还会被用来做一致性读,它们仅仅只在目前没有事务才会被丢弃因为InnoDB会分配了一个一致性读的快照(根据update undo log)用来版本重建。


及时的提交你的事务,包括那些需要一致性读的事务。否则的话,InnoDB是无法丢弃来自update undo log的数据,然后这个roll segment就会变的非常大,充满你的表空间。


rollback segment中的undo log record的物理大小通常是要小于实际的insert或者update的行.你可以通过这个估算你所需要的rollback segment空间。


在InnoDB的多重版本控制模式中,当你执行delete操作时,一行记录不会马上从数据库中物理删除,物理删除只有在这个删除操作的update undo log被丢弃时才会执行。这类删除操作称之位purge(清洗),并且非常快速,通常以这些删除操作的SQL执行顺序来执行。


多重版本控制和二级索引


InnoDB多重版本并发控制(MVCC)处理二级索引是不同于聚簇索引的。聚簇索引的记录是就地更新,它们的隐藏系统列指向了undo log条目(那些早期版本,可以用来重建的记录)。二级索引既没有隐藏系统列也无法就地更新。


当一个二级索引被更新,旧的二级索引会标记为删除,新的会被insert,并且被标记删除的记录最终会被purge。当一个二级索引记录标记为删除或者一个二级索引页被一个新的事物更新,InnoDB会通过聚簇索引来查找该记录。在聚簇索引中,检查记录的DB_TRX_ID,如果一个读事物发起并且记录被修改,记录的正确版本号将从undo log中检索出来。


如果一个二级索引记录被标记为删除或者二级索引页被一个新事物更新,覆盖索引将不会使用。InnoDB将会从聚簇索引中检索到记录。


无论如何,如果ICP被启用的话,WHERE条件部分将会被评估使用了多少个索引,MySQL server会将WHERE条件部分(评估使用的索引)push到storage engine(引擎)。如果没有匹配的数据,聚簇索引将不会被使用。如果匹配的数据被找到,及时有被标记删除的记录,InnoDB也会根据聚簇索引来查找


最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台