如何优化MySQL在执行大事务时产生的大量Undo Log性能开销

陌婷小哥_6227

陌婷小哥_6227

2026-10-02

348人浏览

原创

根本原因是大事务执行中持续写undo log压垮i/o和buffer pool,而非回滚动作本身;优化须从sql行为(如加where、拆分批量)和事务生命周期(及时提交、杀空闲长事务)入手,而非调参。

如何优化mysql在执行大事务时产生的大量undo log性能开销

大事务导致Undo Log性能开销飙升,根本原因不是“回滚慢”,而是事务执行过程中持续写入Undo Log已压垮I/O和buffer pool;优化必须从SQL行为和事务生命周期入手,而非调参。

为什么大事务一跑就卡,回滚更慢

MySQL在UPDATE/DELETE每一行时就同步写一条undo record,不等事务结束。一个更新50万行的事务,会生成50万条undo记录,全部刷盘、占buffer pool、拉长版本链——这阶段IO和内存压力就已经拉满。后续回滚只是“读取并应用”这些早已存在的日志,真正拖慢的是前期积累,不是回滚动作本身。

  • 现象:执行中iostat -x 1看到%util == 100%、await > 20ms;SHOW ENGINE INNODB STATUS\G里History list length持续超5000
  • 误区:以为KILL能立刻释放资源——实际KILL后仍要同步处理完当前page的undo,可能更久
  • 关键点:TRX_ROWS_MODIFIED高 + TRX_STARTED早 = 真正元凶,查INFORMATION_SCHEMA.INNODB_TRX比看配置重要十倍

用WHERE精确过滤,避免全表UPDATE触发海量Undo

全表更新UPDATE t SET a = 1等于给每行都记一条undo record,不管字段是否真变。哪怕只改一个常量,Undo体积也和行数线性正相关。

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载
  • 正确做法:加明确WHERE条件,例如UPDATE t SET a = 1 WHERE status = 'pending' AND id BETWEEN ? AND ?
  • 字段窄一点:只更新必要列,避免UPDATE t SET a=1,b=2,c=3,...全字段赋值(即使值没变,InnoDB仍记完整前镜像)
  • 替代方案:对清空类操作,优先用TRUNCATE TABLE或DROP PARTITION,它们不走Undo,直接释放段

拆分大事务为小批量,控制每次Undo写入量

把单次百万行更新拆成1000行/批,每批提交,可让Undo Log生成节奏可控、及时被purge线程回收,避免单次爆发式写入。

  • 示例SQL循环结构:BEGIN; UPDATE t SET ... WHERE id BETWEEN ? AND ?; COMMIT;,用应用层控制?范围
  • 配合innodb_max_undo_log_size设为128M~256M(即134217728~268435456),确保单个undo表空间不会“一枝独大”
  • 必须开启innodb_undo_log_truncate=ON,否则truncate机制不触发;但注意它默认每128秒检查一次,不是实时收缩
  • 别碰innodb_undo_logs(5.7已废弃)或盲目调innodb_purge_batch_size——purge线程行为和回滚无直接关系

长事务不杀,所有优化都是白忙

一个trx_state = 'RUNNING'且trx_query IS NULL的事务,会钉住所有早于它的undo log,purge线程完全无法清理——此时调再小的innodb_max_undo_log_size也没用。

  • 每5分钟跑一次检测SQL:SELECT trx_id, trx_state, trx_started, TIME_TO_SEC(TIMEDIFF(NOW(), trx_started)) AS duration_sec, trx_rows_modified, SUBSTRING(trx_query, 1, 80) AS trx_query_truncated FROM information_schema.INNODB_TRX WHERE TIME_TO_SEC(TIMEDIFF(NOW(), trx_started)) > 600;
  • 重点杀三类:trx_state = 'RUNNING'且无查询(连接池泄漏)、trx_rows_modified > 10000且运行超5分钟、trx_state = 'LOCK WAIT'但blocking事务可查到
  • KILL前务必确认状态:trx_state = 'ROLLING BACK'时别动,否则会让purge更卡;History list length > 10000时批量KILL需加SLEEP(0.2)防雪崩

最易被忽略的一点:Undo Log膨胀从来不是磁盘空间告急才出事,而是从第一个长事务挂起那一刻,MVCC版本链就开始变长、SELECT语句开始变慢——问题在读多写少的业务里往往滞后暴露,等发现时已积重难返。

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

相关标签:

mysql

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

2053

6

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.21

1259

5

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

735

5

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.19

2712

5

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.25

4508

4

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.08

1059

3

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.11

4771

4

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

2023.08.14

4282

7

mysql事务隔离级别
mysql事务隔离级别

mysql规范中定义了四种事务隔离级别,不同的隔离级别对事务的处理有所不同。本专题为大家提供mysql事务隔离级别相关的文章内容,大家可以免费体验。

2023.08.16

5554

11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 178人学习

使用phpenv集成环境安装极致CMS
使用phpenv集成环境安装极致CMS

共2课时 | 282人学习