Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

17.8.9 清除配置

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

清除操作按照周期性计划运行。它解析和处理撤销日志页面,从历史列表中,历史列表是由 InnoDB 事务系统维护的撤销日志页面列表。清除在处理完毕后释放撤销日志页面。

配置清除线程

清除操作由一个或多个清除线程在后台执行。清除线程的数量由 innodb_purge_threads 变量控制。默认值为 4。

如果 DML 操作集中在单个表上,对该表的清除操作将由单个清除线程执行,这可能会导致清除操作变慢、清除延迟增加和表空间文件大小增加,如果 DML 操作涉及大对象值。如果 innodb_max_purge_lag 设置被超过,清除工作将自动重新分配给可用的清除线程。太多的活动清除线程在这种情况下可能会与用户线程发生争用,因此请适当地管理 innodb_purge_threads 设置。 innodb_max_purge_lag 变量默认值为 0,这意味着没有最大清除延迟。

如果 DML 操作集中在少数表上,请将 innodb_purge_threads 设置保持低,以便线程不争用忙表的访问。如果 DML 操作分布在许多表上,考虑将 innodb_purge_threads 设置为更高。最大清除线程数为 32。

innodb_purge_threads 设置是允许的最大清除线程数。清除系统自动调整使用的清除线程数。

配置清除批处理大小

innodb_purge_batch_size 变量定义了清除从历史列表中解析和处理的撤销日志页面数量。默认值为 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,这意味着没有最大清除延迟和没有延迟。

InnoDB 事务系统维护着一个列表,记录了由 UPDATEDELETE 操作删除标记的索引记录。该列表的长度称为 purge lag。

purge lag 延迟是根据以下公式计算的:

(purge_lag/innodb_max_purge_lag - 0.9995) * 10000

延迟是在 purge 批处理开始时计算的。

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

purge lag 表示为 TRANSACTIONS 部分的 History list length 值在 SHOW ENGINE INNODB STATUS 输出中。

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 增加的原因是,在一致读事务隔离级别(如 REPEATABLE READ)下,事务必须返回创建读取视图时的相同结果。因此,InnoDB 多版本并发控制(MVCC)系统必须在 undo 日志中保留数据副本,直到所有依赖该数据的事务完成。以下是一些可能使 History list length 增加的长时间运行的事务示例:

为了防止极端情况下的延迟,您可以通过设置 innodb_max_purge_lag_delay 变量来限制延迟。该变量指定了 purge lag 阈值被超过时的最大延迟时间(以微秒为单位)。

清除和撤销表空间截断

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