TPS本质是每秒提交或回滚的事务数,需通过两次SHOW GLOBAL STATUS采样Com_commit与Com_rollback差值计算;autocommit=1时普通DML也计入,故Com_commit不等于显式事务数。

查 SHOW GLOBAL STATUS 里的 Com_commit 和 Com_rollback
TPS 的本质就是每秒提交或回滚的事务数,MySQL 没有直接暴露 TPS 的计数器,但 Com_commit 和 Com_rollback 这两个状态变量能反映事务结束动作。它们是累计值,需要间隔采样做差值再除以时间。
- 必须用两次
SHOW GLOBAL STATUS LIKE 'Com_%'(或只查这两个)取差值,不能只看单次值 - 注意:
Com_commit不等于“显式 START TRANSACTION + COMMIT”的数量——autocommit=1 时每个普通 DML(如INSERT)也会触发一次Com_commit - 如果应用大量使用 autocommit,
Com_commit增量会远高于业务逻辑层感知的“事务数”,这是正常现象,不代表监控失真 - 不建议用
Handler_commit,它统计的是存储引擎层提交次数,可能被内部 XA、隐式提交等干扰,稳定性不如Com_commit
用 performance_schema 实时抓事务生命周期(MySQL 5.6+)
当需要区分“哪些事务耗时长”“是否卡在锁上”或排除 autocommit 干扰时,performance_schema 是更干净的来源。关键表是 events_transactions_summary_global_by_event_name 和实时活跃事务表 transaction_instances。
- 启用前确认:
setup_consumers中transactions和events_transactions_current都为ENABLED;setup_instruments中transaction对应行也要开启 -
events_transactions_summary_global_by_event_name提供按事件名(如transaction)聚合的计数和延迟,但它是汇总值,不支持秒级滚动窗口 - 真正做秒级 TPS 采样,得靠轮询
SELECT COUNT(*) FROM performance_schema.transaction_instances WHERE STATE = 'COMMITTED'(配合时间戳过滤),但要注意:该表只存当前活跃/刚结束的事务,默认保留约 10 秒,需及时采集 - 开启
performance_schema有约 3%~5% 的性能开销,高并发写入场景下需实测评估
避开 information_schema.INNODB_TRX 算 TPS 的坑
有人试图用 INNODB_TRX 表里事务数的变化来推 TPS,这是典型误用——这张表只展示“当前未提交的事务”,不是事务完成记录。
-
SELECT COUNT(*) FROM information_schema.INNODB_TRX返回的是并发活跃事务数(类似“排队人数”),不是“每秒办结数” - 即使每秒有 1000 个事务提交,只要它们几乎同时开始又几乎同时结束,
INNODB_TRX的瞬时 COUNT 可能始终为 0 或跳变极大,完全无法反映 TPS - 该表查询本身会加 metadata lock,在大事务存在时可能阻塞其他 DDL,不适合高频轮询
- 真正想看事务堆积,应该结合
TRX_WAITING_TRX_ID和TRX_STATE判断锁等待,而不是算总数
用 mysqladmin extended -r -i 1 快速验证 TPS 趋势
临时排查或上线核对,用原生命令最省事。关键是加 -r(rate mode)让 mysqladmin 自动做差值计算,-i 1 表示每秒刷新。
- 执行:
mysqladmin extended -r -i 1 | grep -E "Com_commit|Com_rollback" - 输出中每行的数值是“自上次刷新以来的增量”,直接对应近似 TPS(注意单位是每秒,不是累计值)
- 该命令依赖
Com_*计数器,所以同样受 autocommit 影响;但它不依赖额外插件或配置,适合应急 - 别用
mysqladmin status,它只显示 uptime 和 threads,没有事务计数 - 生产环境长期采集不推荐此方式,因为每次调用都建立新连接,频繁调用会增加 connection overhead
真正难的不是算出一个数字,而是理解你看到的 TPS 到底代表什么——是业务发起的逻辑事务?还是 MySQL 层面的物理提交?autocommit 开关、框架是否封装了 begin/commit、有没有隐式提交语句(比如 DDL),都会让同一个数字背后含义完全不同。盯指标之前,先确认你的应用怎么用事务。











