14.8.10 清除配置
当您使用 SQL 语句删除行时,InnoDB
不会立即从数据库中物理删除行。仅当InnoDB
丢弃为删除而编写的撤消日志记录时,才会物理删除行及其索引记录。这种删除操作仅发生在不再需要多版本并发控制(MVCC)或回滚的行之后,称为清除。
清除将定期运行。它从历史记录列 table 中解析和处理撤消日志页面,该历史记录列 table 是由InnoDB
Transaction 系统维护的已提交 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阈值时,会对INSERT,UPDATE和DELETE操作施加延迟,以使清除操作有足够的时间赶上。默认值为 0,table 示没有最大吹扫滞后,也没有延迟。
InnoDB
事务系统维护一个事务列 table,这些事务的索引记录已被UPDATE或DELETE操作删除标记。列 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
增加:
-
存在大量并发 DML 时,使用--single-transaction选项的mysqldump操作。
-
禁用autocommit后运行SELECT查询,而忘记发出明确的
COMMIT
或ROLLBACK
。
为了避免在极端情况下过度延迟,在极端情况下,清除延迟会变得很大,您可以通过设置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 空间。