MySQL如何统计一个数据库所有表的数据量

 更新时间:2022年04月15日 14:46:41   作者:smileNicky  
最近在做统计想查找一个数据库里基本所有的表数据量,下面这篇文章主要给大家介绍了关于MySQL如何统计一个数据库所有表的数据量的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

场景:

mysql统计一个数据库里所有表的数据量,最近在做统计想查找一个数据库里基本所有的表数据量,数据量少的通过select count再加起来也是可以的,不过表的数据有点多,不可能一个一个地查

记得在Navicat里,选择一个数据量,点击表,如图:

是可以看到所有表具体的数据行的

然后可以通过sql实现?在mysql里是可以查询information_schema.tables这张表的

SELECT table_rows,table_name FROM information_schema.tables  
 WHERE TABLE_SCHEMA = '数据库名称' 
 and table_name not in ('不查询的表名称') 
 ORDER BY table_rows DESC;

要统计的,加上sum函数就可以

SELECT sum(table_rows) FROM information_schema.tables  
 WHERE TABLE_SCHEMA = '数据库名称' 
 and table_name not in ('不查询的表名称') 
 ORDER BY table_rows DESC;

OK,本来还以为已经没问题了,然后还是被反馈统计不对,后来去找了资料

https://dev.mysql.com/doc/refman/8.0/en/information-schema-tables-table.html

官网的解释:

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%,所以只是一个大概的统计

所以针对这种情况,要更改存储引擎,肯定是不太合适,因为InnoDB是默认的存储引擎,能支持事务外健,并发情况性能也比较好

所以,根据网上的做法,重新analyze 对应表,在mysql8.0版本是不管用的,发现查询数据还是不对,估计是mysql版本太高,mysql5版本没验证过

analyze table [table_name]

继续找资料,在Navicat工具->命令行页面,设置全局或者回话的information_schema_stats_expiry为0,表示自动更新,设置全局的不知道会不会影响性能,所以不知道还是设置会话的就可以

SET SESSION information_schema_stats_expiry=0;
SET @@SESSION.information_schema_stats_expiry=0;

查询设置的information_schema_stats_expiry值

show variables like '%information_schema_stats%';

MySQL 8.0为了提高information_schema的查询效率,会将视图tables和statistics里面的统计信息缓存起来,缓存过期时间由参数information_schema_stats_expiry决定

补充:查询表大小

我需要查询的库名为:kite

因此sql语句为:

select
table_schema as '数据库',
table_name as '表名',
table_rows as '记录数',
truncate(data_length/1024/1024, 2) as '数据容量(MB)',
truncate(index_length/1024/1024, 2) as '索引容量(MB)'
from information_schema.tables
where table_schema='kite'
order by table_rows desc, index_length desc;

结果如下:

总结 

到此这篇关于MySQL如何统计一个数据库所有表数据量的文章就介绍到这了,更多相关MySQL统计所有表数据量内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Mysql之如何修改字段名和字段类型

    Mysql之如何修改字段名和字段类型

    这篇文章主要介绍了Mysql之如何修改字段名和字段类型问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • mysql主从及遇到的问题解决

    mysql主从及遇到的问题解决

    本文详细介绍了如何使用Docker配置MySQL主从复制,首先创建了两个文件夹并分别配置了`my.cnf`文件,通过执行脚本启动容器并配置好主从关系,文中还提到了一些常见问题的解决方法,如配置路径错误导致的冲突和slave的change连接错误
    2025-01-01
  • MySQL自动安装批处理脚本实例代码

    MySQL自动安装批处理脚本实例代码

    为了日后安装数据库方便,下面这篇文章主要给大家介绍了关于MySQL自动安装批处理脚本的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • mysql脏页是什么

    mysql脏页是什么

    本文主要介绍了什么是mysql脏页,为什么会出现脏页,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-07-07
  • SQL如何获取目标时间点或日期的方法实例

    SQL如何获取目标时间点或日期的方法实例

    日期获取在我们日常开发中经常会遇到,这篇文章主要给大家介绍了关于SQL如何获取目标时间点或日期的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-10-10
  • MySQL外键类型及应用场景总结

    MySQL外键类型及应用场景总结

    这篇文章主要介绍了 MySQL 外键的类型(RESTRICT、CASCADE、SET NULL、NO ACTION)及其应用场景、优缺点和使用注意事项,通过创建和测试外键,阐述了不同类型外键在主表删除或更新数据时子表的变化,需要的朋友可以参考下
    2024-12-12
  • iOS开发runloop运行循环机制学习

    iOS开发runloop运行循环机制学习

    这篇文章主要为大家介绍了iOS开发runloop运行循环的机制学习,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • Mysql 行级锁的使用及死锁的预防方案

    Mysql 行级锁的使用及死锁的预防方案

    mysql的InnoDB,支持事务和行级锁,可以使用行锁来处理用户提现等业务。使用mysql锁的时候有时候会出现死锁,要做好死锁的预防。这篇文章通过实例应用给大家讲解
    2016-12-12
  • MySQL如何查询数据库中所有表名及注释等信息

    MySQL如何查询数据库中所有表名及注释等信息

    这篇文章主要介绍了MySQL如何查询数据库中所有表名及注释等信息问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • MySQL单表查询操作实例详解【语法、约束、分组、聚合、过滤、排序等】

    MySQL单表查询操作实例详解【语法、约束、分组、聚合、过滤、排序等】

    这篇文章主要介绍了MySQL单表查询操作,结合实例形式详细分析了mysql单表查询的语法、约束、分组、聚合、过滤、排序等相关原理、操作技巧与注意事项,需要的朋友可以参考下
    2019-12-12

最新评论