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

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

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

  采用的方法:测试时,采用如下 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(*) 语句来统计。

你可能感兴趣的:(MySQL,数据库,mysql)