MySQL 数据库中的多版本控制

MySQL 数据库保留有关更改行的旧版本信息,并支持并发和回滚等事务特性。
回滚段是包含撤消日志的 InnoDB 存储区域。
当这些查询是在不同时间启动的事务的一部分时,InnoDB 可以响应对同一行的多个版本的查询。
它使用部分撤消日志,即更新撤消缓冲区来构建较早版本的数据库行。

InnoDB 管理的每一行用户数据都存在三个隐藏字段:

  • DB_TRX_ID :六字节字段,指示插入或者更新行的最后一个事务的事务标识符。此外,删除在内部被视为更新,其中设置了行中的特殊位以将其标记为已删除。
  • DB_ROLL_PTR :称为滚动指针的七字节字段。它指向写入回滚段的撤消日志记录。如果该行被更新,撤消日志记录包含在更新前重建该行内容所需的信息。
  • DB_ROW_ID :包含行 ID 的六字节字段,该行 ID 在插入新行时自动递增。如果 InnoDB 自动生成聚集索引,则索引包含行 ID 值。否则,DB_ROW_ID 列不会出现在任何索引中。

如果我们在表中以相同的速率小批量插入和删除行,清除线程可能会滞后,并且由于所有“死”行,表会变得越来越大,从而使所有内容都受磁盘限制并且非常缓慢。
在这种情况下,通过调整 innodb_max_purge_lag 系统变量来限制新行操作并将更多资源分配给清除线程。

MySQL 数据库仅在丢弃为删除而写入的更新撤消日志记录时才物理删除行(及其索引)。
这是一个快速清除操作。
清除线程可能需要更多资源,因为它会变慢并占用磁盘空间。

日期:2020-09-17 00:11:46 来源:oir作者:oir