diff --git a/mysql/mysql文档/mysql_事务.md b/mysql/mysql文档/mysql_事务.md index f5c0843..2c9374e 100644 --- a/mysql/mysql文档/mysql_事务.md +++ b/mysql/mysql文档/mysql_事务.md @@ -290,11 +290,32 @@ innodb通过segment来管理undo log,其管理方式如下: 每个rollback segments支持的事务数量由`rollback segment中undo slot的数量`和`每个事务需要的undo log数量`来决定。 > 当innodb页大小为16KB时,rollback segment中undo slot的数量为`innodb page size/ 16`,即1024个。 +> +> 易知,每个slot占用的大小为`16bit`,即长度为2字节。 +> +> 故而,`slot中存放的是指向undo segment的句柄,而不是存放undo segment本身`。 ##### innodb_undo_tablespaces 该变量设置了undo tablespaces的数量。 - +##### purge +在事务i提交之后,并不能立刻删除undo log以及undo log所在的页,`其他事务仍有可能通过undo log来还原数据行的之前版本`。故而,在事务提交时,会将undo log放入到一个链表中,交由purge线程来决定是否最终删除undo log以及undo log所在的页。 + +> purge代表`清空不再被需要的旧版本数据行及其对应的undo log记录。 + +如果为每一个事务分配一个单独的undo页,那么会非常浪费存储空间。由于事务提交时,所分配的undo页并不能立刻释放,故而,当数据库负载较大时,可能同时存在大量的undo页,会占用相当多的存储空间。 + +##### undo页的重用设计 +在innodb对undo页的设计中,考虑了对undo页的重用。当事务提交时,首先会将undo log放在链表中,然后判断undo页的使用空间是否小于`3/4`。如果是,代表该undo页可以被重用,之后新的undo log会记录在当前undo log的后面。 + +#### 核心概念 +##### rollback segment +undo tablespace由rollback segment构成,每个undo tablespace最多支持128个rollback segment,`innodb_rollback_segments`定义了rollback segments的数量。 + +##### undo slots +undo slot是rollback segment内的slot,由rollback segment进行管理。 + +undo slot主要用于关联undo segment,`当事务启动时,系统会从rollback segment中获取一个空闲的undo slot`,`成功获取undo slot后即代表关联了一个undo segment`