直接查 information_schema.tables 的 TABLE_ROWS 不准,因为它是 InnoDB 的估算值,误差可达10%~50%;准确行数必须用 SELECT COUNT(*),建议用脚本自动循环执行并单独提交,避开系统表、处理特殊字符、设置超时,结果导出为CSV。
直接查
为什么不准?
因为
在 InnoDB 表中是估算值,
也一样——MySQL 不实时维护精确行数,尤其在有频繁 DELETE/INSERT 的表上,误差可能达 10%~50%。如果你需要审计、迁移前校验或生成报表,不能依赖这个字段。
用
逐表执行但不锁表
真正准确的行数必须走
,但全库几十上百张表手动写 SQL 太累,还容易漏。关键点在于:避免长事务和表级锁。InnoDB 下
走的是聚簇索引遍历,不加写锁,但会持有读视图(MVCC),所以建议在低峰期跑,且每条语句单独提交。
实操建议:
用存储过程或客户端脚本生成语句,例如:
把结果导出为 SQL 文件后执行,不要用事务包裹所有
,否则事务过长会拖慢其他业务
对超大表(比如 >5000 万行),先用
看是否能走覆盖索引;如果
执行超过 30 秒,考虑加
验证语句语法,再分批处理
Python 脚本自动收集并输出 CSV
比纯 SQL 更可控,还能跳过系统表、忽略视图、超时中断、记录耗时。核心是用
或
连接后循环执行
。
MySQL(Linux)
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
下载
注意几个坑:
和
表不能直接
,会报错,需显式过滤:
表名含特殊字符(如短横线、中文)时,
拼接的 SQL 必须用反引号包裹
某些表可能被其他会话锁住(比如正在 ALTER),加上
参数防止脚本卡死
结果建议写入 CSV 时用
而非字符串拼接,避免字段含逗号或换行导致格式错乱
为什么不用
+ 行数统计?
有人想靠解析
输出的
来推断大小,这是误区。dump 不包含行数信息;而
导出的文本文件虽可
,但前提是表已导出且没压缩,实际效率更低、磁盘开销更大,还引入了额外 I/O 和权限问题。
真正省事又准的方式,还是脚本驱动
——只要别忘了给大表留缓冲时间,也别把结果硬塞进一个超长事务里。
information_schema.tablesTABLE_ROWSSHOW TABLE STATUSSELECT COUNT(*)COUNT(*)COUNT(*)SELECT CONCAT('SELECT ''', table_name, ''' AS table_name, COUNT(*) AS row_count FROM `', table_schema, '`.`', table_name, '`;') FROM information_schema.tables WHERE table_schema = 'your_db' AND table_type = 'BASE TABLE';COUNT(*)EXPLAINCOUNT(*)LIMIT 1mysql-connector-pythonpymysqlCOUNT(*)information_schemaperformance_schemaCOUNT(*)WHERE table_schema NOT IN ('information_schema', 'performance_schema', 'mysql')CONCATtable_nametimeout=10csv.writermysqldump --no-datamysqldump --no-dataCREATE TABLE--tabwc -lCOUNT(*)