MySQL 如何统计一个数据库中每个表的数据量

文章讨论了在项目中统计数据库表数据量的需求,使用SQL语句遇到的不准确性问题,原因在于InnoDB存储引擎的估算值可能有较大偏差。提出可以考虑使用COUNT(*)获取准确计数或根据实际需求调整存储引擎。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、诉求、采用的方法及出现的问题

  在项目中,有这样一种诉求:统计数据库中每张表的数据量。

  采用的方法:测试时,采用如下 SQL 语句进行统计(其中,测试时所用的数据库名称是 testmgmdb)。

SELECT table_rows, table_name FROM information_schema.tables WHERE TABLE_SCHEMA = 'testmgmdb';

  出现的问题:语句执行成功后,查询出了该数据库下的每张表的数据量。然而,结果并不准确。

二、查询结果不准确的原因

  MySQL 官方网站对这个问题的解释如下所示(官网链接:26.3.38 The INFORMATION_SCHEMA TABLES Table)。

TABLE_ROWS
The number of rows. Some storage engines, such as MyISAM, store the exact count. For other storage engines, such as InnoDB, this value is an approximation, and may vary from the actual value by as much as 40% to 50%. In such cases, use SELECT COUNT(*) to obtain an accurate count.
TABLE_ROWS is NULL for INFORMATION_SCHEMA tables.
For InnoDB tables, the row count is only a rough estimate used in SQL optimization. (This is also true if the InnoDB table is partitioned.)

  翻译成中文,如下所示:

表格行
行数。某些存储引擎(如MyISAM)存储确切的计数。对于其他存储引擎,如 InnoDB,此值是近似值,与实际值的差异可能高达 40% 到 50%。在这种情况下,请使用 SELECT COUNT(*) 来获得准确的计数。
对于 INFORMATION_SCHEMA 表,TABLE_ROWS 为 NULL。
对于 InnoDB 表,行数只是 SQL 优化中使用的粗略估计。(如果 InnoDB 表是分区的,也是如此。)

  针对这种情况,可以更改存储引擎(实际项目中,肯定是不太合适,因为 InnoDB 是默认的存储引擎,能支持事务、外键,并发性能也比较好),或者直接使用 SELECT COUNT(*) 语句来统计。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值