MySQL 的 undo 日志有什么用?
作用:实现事务回滚
Undo log 是 InnoDB MVCC 事务特性的重要组成部分。当我们对记录做了变更操作时就会产生 undo 记录,Undo 记录默认被记录到系统表空间 (ibdata) 中,但从 5.6 开始,也可以使用独立的 Undo 表空间。
Undo 记录中存储的是老版本数据,当一个旧的事务需要读取数据时,为了能读取到老版本的数据,需要顺着 undo 链找到满足其可见性的记录。当版本链很长时,通常可以认为这是个比较耗时的操作。
大多数对数据的变更操作包括 INSERT/DELETE/UPDATE,其中 INSERT 操作在事务提交前只对当前事务可见,因此产生的 Undo 日志可以在事务提交后直接删除(谁会对刚插入的数据有可见性需求呢!!),而对于UPDATE/DELETE 则需要维护多版本信息,在 InnoDB 里,UPDATE 和DELETE 操作产生的 Undo 日志被归成一类,即 update_undo。