InnoDB
当您使用SQL语句删除行时,不会立即从数据库中物理删除该行。一行及其索引记录仅在以下情况下被物理删除InnoDB
丢弃为删除而写入的undo日志记录。这种删除操作称为清除(purge),它只在多版本并发控制(MVCC)或回滚不再需要该行之后才会发生。
清除按定期计划运行。它解析和处理来自历史列表的撤消日志页,历史列表是已提交事务的撤消日志页列表,由InnoDB
交易系统。清除在处理完undo日志页后将其从历史记录列表中释放。
配置清除线程
清除操作由一个或多个清除线程在后台执行。清除线程的数量由innodb_purge_threads
变量。缺省值为4。
如果DML操作集中在单个表上,则该表的清除操作由单个清除线程执行,如果DML操作涉及大对象值,则可能导致清除操作变慢、清除延迟增加和表空间文件大小增加。从MySQL 8.0.26,如果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
并将该页数分配给每个清除线程。
清除系统还释放不再需要的撤消日志页。它通过undo日志每128次迭代执行一次。除了定义在批处理中解析和处理的撤消日志页的数量外,还可以使用innodb_purge_batch_size
变量定义通过undo日志每128次迭代清除一次的撤消日志页的数量。
的innodb_purge_batch_size
变量用于高级性能调优和实验。大多数用户不需要更改innodb_purge_batch_size
从默认值开始。
配置最大清除延迟时间
的innodb_max_purge_lag
变量定义所需的最大清除延迟。清除延迟超过innodb_max_purge_lag
阈值,一个延迟被施加插入
,更新
,删除
操作为清除操作留出时间。默认值为0,这意味着没有最大清除延迟和延迟。
的InnoDB
事务系统维护一个事务列表,这些事务的索引记录由更新
或删除
操作。列表的长度是清除延迟。在MySQL 8.0.14之前,清除延迟是通过以下公式计算的,结果是最小延迟为5000微秒:
(清除滞后/innodb_max_purge_lag - 0.5) * 10000
从MySQL 8.0.14开始,清除延迟是通过以下修正公式计算的,它将最小延迟减少到5微秒。5微秒的延迟更适合现代系统。
(innodb_max_purge_lag - 0.9995) * 10000
延迟在清除批处理开始时计算。
一个典型的innodb_max_purge_lag
有问题的工作负载的设置可能是1000000(100万),假设事务很小,大小只有100字节,并且允许有100MB未清除的表行。
扫扫滞后表现为历史列表长度
的价值交易
的部分显示引擎innodb状态
输出。
显示引擎INNODB状态...------------ TRANSACTIONS ------------ Trx id计数器0 290328385已清除Trx的n:o < 0 290315608撤消n:o < 0 17历史列表长度为20
的历史列表长度
通常是一个较低的值,通常小于几千,但是写量大的工作负载或长时间运行的事务会导致它增加,即使对于只读的事务也是如此。长时间运行的事务可能导致历史列表长度
增加是在一致的读事务隔离级别下,例如可重复读取
,事务必须返回与创建该事务的读视图时相同的结果。因此,InnoDB
多版本并发控制(MVCC)系统必须在撤销日志中保留一份数据副本,直到依赖于该数据的所有事务都完成为止。的长时间运行的事务示例历史列表长度
增加:
一个, mysqldump操作,该操作使用
——单独的事务
选项,同时有大量的并发DML。
在清除延迟变得很大的极端情况下,为了防止过度延迟,可以通过设置innodb_max_purge_lag_delay
变量。的innodb_max_purge_lag_delay
属性时施加的延迟的最大延迟(以微秒为单位)innodb_max_purge_lag
超过阈值。指定的innodb_max_purge_lag_delay
属性计算的延迟时间上限innodb_max_purge_lag
公式。
清除和撤销表空间截断
清除系统还负责截断undo表空间。您可以配置innodb_purge_rseg_truncate_frequency
变量来控制清除系统查找要截断的撤消表空间的频率。有关更多信息,请参见截断Undo表空间.