5.6版本之前mysql的udno是放在ibdata中,在5.6后可以设置undo的参数来指定undo的存储
mysql> show variables like '%undo%';
+-------------------------+-------+
| Variable_name | Value |
+-------------------------+-------+
| innodb_undo_directory | . |
| innodb_undo_logs | 128 |
| innodb_undo_tablespaces | 0 |
+-------------------------+-------+
innodb_undo_tablespaces这个参数控制着undo表空间的个数,范围是0到126
在大事务的情况下,单个的undo表空间文件可能会很大,放在多个表空间中会减少这个问题。默认的undo的大小是10m。
innodb_undo_logs这个参数控制着undo段的数量0~128.
在rr级别下,如果一个读取事务很久没有提交,那么后面使用的undo都不能被释放,导致回滚段很大。因为要使用快照读取。如果innodb_undo_tablespaces的值设置为0,那么undo的数据还是放在ibdata中的。
在mysql技术内幕innodb存储引擎一书中,描述了一致性读的实现,书中提到mysql对于delete的操作不是马上去删除,而是标记,用来进行一致性的读,过后会删除。这个不知道是否正确。