InnoDB使用SQL语句删除行时,不会立即从数据库中物理删除行。仅当InnoDB丢弃为删除而编写的撤消日志记录时,才物理删除行及其索引记录 。这种删除操作仅发生在不再需要多版本并发控制(MVCC)或回滚的行之后,称为清除。
清除会定期执行。它从历史记录列表中解析和处理撤消日志页面,该历史记录列表是由InnoDB事务系统维护的已提交事务的撤消日志页面的列表 。清除后,撤消日志页面将从历史记录列表中释放出来。
配置清除线程
清除操作由一个或多个清除线程在后台执行。清除线程的数量由innodb_purge_threads变量控制 。缺省值为4。如果DML操作集中在单个表或几个表上,请将设置保持较低,以免线程相互竞争以访问表。如果DML操作分散在许多表中,请增加设置。清除线程的最大数量为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 阈值时,延迟征收 INSERT, UPDATE以及 DELETE业务,以便有时间清除操作赶上。默认值为0,这意味着没有最大吹扫滞后且没有延迟。
该InnoDB交易系统认为有通过索引记录删除标记事务的列表 UPDATE或 DELETE操作。列表的长度是清除延迟。在MySQL 8.0.14之前,清除延迟延迟是通过以下公式计算的,这导致最小延迟为5000微秒:
(purge lag/innodb_max_purge_lag - 0.5) * 10000
从MySQL 8.0.14开始,清除延迟延迟是通过以下修订公式计算的,该公式将最小延迟减少到5微秒。延迟5微秒更适合现代系统。
(purge_lag/innodb_max_purge_lag - 0.9995) * 10000
延迟是在清洗批次开始时计算的。
innodb_max_purge_lag 有问题的工作负载的 典型设置可能是1000000(100万),假定事务很小,大小仅为100字节,并且允许有100MB的未清除表行。
吹扫滞后表示为输出 部分中的History list length值。
TRANSACTIONSSHOW 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)系统必须在撤消日志中保留数据的副本,直到所有依赖于该数据的事务都完成为止。以下是长期交易可能导致交易History list length增加的示例:
一个mysqldump的使用操作 --single-transaction选项,同时还有并发DML的显著量。
SELECT禁用后 运行查询autocommit,而忘记发出显式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公式计算的延迟时间的上限 。
清除和撤消表空间截断
清除系统还负责截断撤消表空间。您可以配置 innodb_purge_rseg_truncate_frequency 变量以控制清除系统查找要截断的撤消表空间的频率。