14.8.10 清除配置

当您使用 SQL 语句删除行时,InnoDB不会立即从数据库中物理删除行。仅当InnoDB丢弃为删除而编写的撤消日志记录时,才会物理删除行及其索引记录。这种删除操作仅发生在不再需要多版本并发控制(MVCC)或回滚的行之后,称为清除。

清除将定期运行。它从历史记录列 table 中解析和处理撤消日志页面,该历史记录列 table 是由InnoDBTransaction 系统维护的已提交 Transaction 的撤消日志页面的列 table。清除后,撤消日志页面将从历史记录列 table 中释放出来。

配置清除线程

清除操作由一个或多个清除线程在后台执行。清除线程的数量由innodb_purge_threads变量控制。缺省值为 4.如果 DML 操作集中在单个 table 或几个 table 上,请将设置保持较低,以使线程彼此之间不争用访问繁忙的 table。如果 DML 操作分散在许多 table 中,请增加设置。清除线程的最大数量为 32.

innodb_purge_threads设置是允许的最大清除线程数。清除系统会根据需要自动调整清除线程的数量。

配置清除批次大小

innodb_purge_batch_size变量定义从历史记录列 table 中批量清除解析和处理的撤消日志页面的数量。默认值为 300.在多线程清除配置中,协调器清除线程将innodb_purge_batch_size除以innodb_purge_threads并将该页数分配给每个清除线程。

清除系统还会释放不再需要的撤消日志页面。它会在撤消日志中每 128 次迭代执行一次。除了定义批量分析和处理的撤消日志页面的数量之外,innodb_purge_batch_size变量还定义了撤消日志,该撤消日志页面的数量通过撤消日志每 128 迭代释放一次。

innodb_purge_batch_size变量用于高级性能调整和实验。大多数用户无需更改innodb_purge_batch_size的默认值。

配置最大清除延迟

innodb_max_purge_lag变量定义所需的最大吹扫滞后时间。当清除滞后时间超过innodb_max_purge_lag阈值时,会对INSERTUPDATEDELETE操作施加延迟,以使清除操作有足够的时间赶上。默认值为 0,table 示没有最大吹扫滞后,也没有延迟。

InnoDB事务系统维护一个事务列 table,这些事务的索引记录已被UPDATEDELETE操作删除标记。列 table 的长度是清除延迟。清除延迟延迟是通过以下公式计算的,这导致最小延迟为 5000 微秒:

(purge lag/innodb_max_purge_lag - 0.5) * 10000

延迟是在清洗批次开始时计算的

有问题的工作负载的典型innodb_max_purge_lag设置可能是 1000000(100 万),假设事务很小,大小仅为 100 字节,并且允许有 100MB 的未清除 table 行。

清除滞后在显示引擎的 INNODB 状态输出的TRANSACTIONS部分中以History list length值 table 示。

mysql> SHOW ENGINE INNODB STATUS;
...
------------
TRANSACTIONS
------------
Trx id counter 0 290328385
Purge done for trx's n:o < 0 290315608 undo n:o < 0 17
History list length 20

History list length通常是一个低值,通常小于几千,但是繁重的工作负载或长时间运行的事务可能导致History list length增大,即使对于只读事务也是如此。长时间运行的事务可能导致History list length增加的原因是,在一致的读取事务隔离级别(例如REPEATABLE READ)下,事务必须返回与创建该事务的读取视图时相同的结果。因此,InnoDB多版本并发控制(MVCC)系统必须在撤消日志中保留数据的副本,直到所有依赖于该数据的事务都完成为止。以下是长时间运行的事务的示例,这些事务可能导致History list length增加:

为了避免在极端情况下过度延迟,在极端情况下,清除延迟会变得很大,您可以通过设置innodb_max_purge_lag_delay变量来限制延迟。 innodb_max_purge_lag_delay变量指定在超过innodb_max_purge_lag阈值时施加的延迟的最大延迟(以微秒为单位)。指定的innodb_max_purge_lag_delay值是由innodb_max_purge_lag公式计算的延迟周期的上限。

清除和撤消 table 空间截断

清除系统还负责截断撤消 table 空间。您可以配置innodb_purge_rseg_truncate_frequency变量来控制清除系统查找要截断的撤消 table 空间的频率。有关更多信息,请参见截断撤消 table 空间