首先使用EXPLAIN分析事务中各SQL的执行计划,重点关注索引使用与扫描行数;再通过SHOW ENGINE INNODB STATUS和information_schema.innodb_trx查看事务状态与锁竞争情况;接着启用Performance Schema监控事务全过程的等待事件与执行耗时;最后结合慢查询日志和通用日志追踪实际执行顺序与性能瓶颈,综合判断事务是否存在阻塞、回滚或长时间运行问题。

MySQL中分析事务执行计划,重点是理解事务中的SQL语句如何执行、是否使用索引、是否存在锁竞争或回滚等问题。虽然MySQL没有直接针对“事务”的执行计划命令,但可以通过EXPLAIN、SHOW ENGINE INNODB STATUS、INFORMATION_SCHEMA等工具来间接分析事务的执行行为。
1. 使用EXPLAIN分析事务中的SQL语句
EXPLAIN 是分析单条SQL执行计划的核心工具。在事务中涉及的SELECT、UPDATE、DELETE等语句,都可以提前用EXPLAIN查看其执行路径。
- 在事务开始前,对关键SQL运行 EXPLAIN,查看是否走索引、扫描行数、是否出现临时表或文件排序。
- 重点关注 type(访问类型)、key(使用的索引)、rows(扫描行数)、Extra(额外信息)。
例如:
EXPLAIN SELECT * FROM orders WHERE user_id = 100 AND status = 'paid';如果type为ALL,表示全表扫描,可能需要优化索引。
2. 查看事务状态和锁信息
事务执行过程中,尤其是并发场景下,锁等待会显著影响性能。可通过以下方式查看事务内部行为:
- SHOW ENGINE INNODB STATUS\G:显示最近的死锁信息、当前活跃事务、锁等待情况。
- information_schema.innodb_trx:查看当前正在运行的InnoDB事务。
- information_schema.innodb_locks 和 innodb_lock_waits(MySQL 5.7及以前):查看锁和等待关系(MySQL 8.0已移除,可用 performance_schema 替代)。
常用查询:
SELECT trx_id, trx_state, trx_started, trx_mysql_thread_id, trx_queryFROM information_schema.innodb_trx\G
可帮助判断某个事务是否长时间运行、是否被阻塞。
3. 开启Performance Schema进行细粒度分析
MySQL的Performance Schema可以跟踪事务的开始、提交、回滚时间,以及每个阶段的等待事件。
- 确保performance_schema开启,并启用事务事件采集:
WHERE NAME LIKE 'events_transactions%';
- 查询事务执行详情:
FROM performance_schema.events_transactions_current
WHERE thread_id = (SELECT THREAD_ID FROM performance_schema.threads WHERE PROCESSLIST_ID = CONNECTION_ID());
这能帮你看到事务持续时间、是否只读、加锁情况等。
4. 结合日志分析实际执行流程
开启通用查询日志(general log)或慢查询日志(slow query log),可以记录事务中每条语句的执行顺序和耗时。
- 通用日志记录所有语句,适合调试小流量环境。
- 慢查询日志可捕获执行时间长的事务操作,配合 long_query_time 设置阈值。
启用慢查询日志:
SET GLOBAL slow_query_log = ON;SET GLOBAL long_query_time = 1;
之后通过 mysqldumpslow 或 pt-query-digest 分析日志。
基本上就这些。关键是把事务拆解成具体SQL,用EXPLAIN看执行计划,用系统表看事务状态,用Performance Schema和日志看执行过程。这样就能全面掌握事务的执行行为。










