14.2.3 InnoDB Multi-Versioning innoDB 多版本
InnoDB 是一个多版本存储引擎, 它保留信息关于老版本的更改的行,
为了支持事务的特性比如并发和恢复。
这个信息是存在表空间在数据目录叫做回滚段(Oracle类似的数据结构).
InnoDB 使用 回滚段的信息来执行回滚操作 。它也用于创建一致性读。
在内部, InnoDB 增加 3个域给每个行存储在数据库里,
A 6字节DB_TRX_ID 字段表示事务标示 对于最好的事务,插入或者更改记录。
一个删除内部处理为update ,指定的bit 在记录里被标记为删除。
每行业包含一个-位 DB_ROLL_PTR 域被称为roll pointer.
roll pointer 指向一个undo log 记录 。
如果记录被更新,undo log 记录包含必要的信息来创建更新前的内容。
A 6-byte DB_ROW_ID 字段包含一个row ID 单调增加 被插入的新的记录。
如果 InnoDB 自动的产生一个clustered index ,index 包含row ID 值,
否则 DB_ROW_ID 列不出现在任何索引。
Undo logs 在回滚段 是被分隔成insert和update undo logs.
Insert undo logs 只被需要在事务回滚,可以被丢弃在事务提交的时候。
Updates undo logs 是用于一致性读,
它们消失只能在目前没有事务,InnoDB 已经分配一个快照,一致性读需要信息在update undo log 来创建数据库的一个早期的版
本。
提交你的事务,包括那些事务 只执行一致性读,否则,
InnoDB 不能丢失更新undo logs的数据, 回滚段 可能增加的更大,填满你的空间。
一个回滚日志记录在回滚段的大小通常是小于相应的插入或者修改的行。
你可以使用这个信息来计算你的回滚段的空间。
ibdata1存了什么?
当你启用了 innodb_file_per_table,表被存储在他们自己的表空间里,但是共享表空间仍然在存储其它的 InnoDB 内部数据:
数据字典,也就是 InnoDB 表的元数据
变更缓冲区
双写缓冲区
撤销日志
在InnoDB 多版本scheme,行不是立即从数据库物理删除的 当你删除它。
InnoDB 只有物理删除相应的记录和它的index records 当它 丢弃update undo log 记录
这种操作称为purge,它是很快的
Multi-Versioning and Secondary Indexes 多版本和Secondary 索引
InnoDB 的多版本的并发控制(MVCC) 对待secondary indexes 不同于clustered 索引。
记录在一个clustered 索引是被更新, 它们的隐藏的系统列指向undo log entries 早期的记录的版本被构建
不像clustered index records, secondary index records不包含隐藏的列也不包含更新的地方。
当一个 secondary index 列被更新, 老的secondary index records 是删除标记的,
新的records 被插入,标记为删除的被最终删除。
当一个secondary index record 是被标记删除或者the secondary index page 被新的会话更新,
InnoDB 查找数据库记录在clustered index.在 clustered index,
记录的DB_TRX_ID 是被检查 记录的正确的版本是从Undo log 检索
如果记录被修改在读取事务被初始化后。
如果一个secondary index 记录是被标记为删除或者一个secondary index page被一个新的事务更新。
转换index技术是不能用的, 代替的是从index 结构返回值, InnoDB 在clustered index 中查询。