InnoDB是一个支持多版本的存储引擎:为了支持事务并发和回滚的特征,InnoDB保留了已经改变的行的旧版本的信息。这种信息被保存在表空间的一种称作回滚段的数据结构中(类似于Oracle的回滚段)。InnoDB使用这个回滚段的信息来回滚事务。他也用来构建支持并发读的行的多版本。
在内部,InnoDB增加三个字段来存储数据的行信息。DB_TRX_ID长6字节,他标识着最近插入或者更新行的事务的id号,另外,行的删除在InnoDB内部被当做更新来对待,在该标志位上打上一个已删除的标记。每行还有一个7字节的DB_ROLL_PTR字段叫做回滚指针,这个回滚指针指向回滚段的回滚日志,如果行被更新,那么回滚段中会包含行被更新前的重建信息。6字节的DB_ROW_ID存储的是插入行的一个单调递增的row id,如果InnoDB有自动增长的聚族索引,那么这个索引就包含row id的值,否则,row id列不会出现在任何索引中。
回滚段中的重做日志分成插入回滚和更新回滚日志。插入重做日志只是在事务回滚的时候用到而且一但事务提交回滚日志就被自动丢弃。update回滚日志也用于做一致性读,但是当为InnoDB分配的在update回滚日志中用于建立旧版本的行信息的一致性读快照不在事务当中出现后,那么这个update回滚日志将会被丢弃。
定期提交你的事务,包括那些只是执行一致性读的事务,不然的话InnoDB不会丢弃update回滚日志中的数据,并且回滚段可能会变得很大而撑满了你的表空间。
回滚段中回滚日志的大小比他更新的相关行的大小小。你能通过这些信息计算出回滚段的需要多大的空间。
在InnoDB多版本控制中,当你执行delete语句删除行的时候,这些行并没有被真正的删除,
阅读(1055) | 评论(0) | 转发(0) |