刚开始统计数据库中有多少行数据的时候,使用information_schema.TABLES去统计发现误差很大,官网的解释如下:

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为空。对于InnoDB表,行数只是SQL优化中使用的一个粗略估计。(如果InnoDB表是分区的,这也是正确的。)

我们一般都是用的InnoDB的存储引擎,这里关于引擎的选择暂时不表。

然后就想着通过count函数去统计每个表的数据量。一个个去写太麻烦了,就想着整个存储过程简化一下工作量,好久没写过存储过程了,就决定试一下。中间也碰到很多无法预料的bug,磕磕绊绊的总算搞定了。

首先创建个保存数据表行数的表,建表语句如下:


DROP TABLE IF EXISTS `statistics_lg`;
CREATE TABLE `statistics_lg`  (`id` int(0) NOT NULL AUTO_INCREMENT,`schema_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`table_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`total_num` bigint(0) NULL DEFAULT NULL,`create_time` date NULL DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 16 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;SET FOREIGN_KEY_CHECKS = 1;

其中有定义了两个IN参数,schema_name_lg 表示需要统计的数据库的名称,rows_limit表示超过多少行的表才去统计,因为有些垃圾表,或者数据量少的表就没必要每天去统计数据量了,这个可以动态调整的,我这边先设置了100.

CREATE DEFINER=`root`@`localhost` PROCEDURE `table_statistics`(in schema_name_lg VARCHAR(100),in rows_limit int)
BEGIN
-- 定义变量
DECLARE isFinished INT DEFAULT FALSE;
DECLARE total VARCHAR(1000) DEFAULT '' ;
DECLARE tablenamelg VARCHAR(1000);
-- 定义游标
DECLARE table_cursor CURSOR FOR SELECT TABLE_NAME FROM information_schema.`TABLES` WHERE TABLE_SCHEMA= schema_name_lg;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET isFinished=true;
-- 开启游标
OPEN table_cursor;
REPEAT
-- 游标中取到表名赋值给变量tablenamelg
FETCH table_cursor INTO tablenamelg;IF isFinished = false THENSET @sqltext=concat('select count(1) into @total from ',schema_name_lg ,'.',tablenamelg,';');PREPARE c_tab_stat from @sqltext;EXECUTE c_tab_stat ; SET total=@total;END IF;IF total>rows_limit THEN insert into isc.statistics_lg (schema_name,table_name,total_num,create_time) VALUES (schema_name_lg,tablenamelg,total,CURRENT_DATE);END IF;
UNTIL isFinished
END REPEAT;
CLOSE table_cursor;
END

这个是mysql8的语法,如果mysql5 执行报错的话,就需要先改一下结束符用//,之后再改过来用;

不然就会认为分号就是结束标记,下面的代码执行就报错了。

delimiter //
CREATE DEFINER=`root`@`localhost` PROCEDURE `table_statistics`(in schema_name_lg VARCHAR(100),in rows_limit int)
BEGIN
-- 定义变量
DECLARE isFinished INT DEFAULT FALSE;
DECLARE total VARCHAR(1000) DEFAULT '' ;
DECLARE tablenamelg VARCHAR(1000);
-- 定义游标
DECLARE table_cursor CURSOR FOR SELECT TABLE_NAME FROM information_schema.`TABLES` WHERE TABLE_SCHEMA= schema_name_lg;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET isFinished=true;
-- 开启游标
OPEN table_cursor;
REPEAT
-- 游标中取到表名赋值给变量tablenamelg
FETCH table_cursor INTO tablenamelg;IF isFinished = false THENSET @sqltext=concat('select count(1) into @total from ',schema_name_lg ,'.',tablenamelg,';');PREPARE c_tab_stat from @sqltext;EXECUTE c_tab_stat ; SET total=@total;END IF;IF total>rows_limit THEN insert into isc.statistics_lg (schema_name,table_name,total_num,create_time) VALUES (schema_name_lg,tablenamelg,total,CURRENT_DATE);END IF;
UNTIL isFinished
END REPEAT;
CLOSE table_cursor;
END //
delimiter ;

调用的话,就直接call table_statistics('test',100); 就把统计的数据insert到statistics_lg表了

mysql统计数据库中表的行数统计相关推荐

  1. PostgreSQL表的行数统计

    PostgreSQL表的行数统计 在很多情况下我们需要知道一个表的记录数有多少.如果你发现你有这样的需求,你还应该问问这样的统计的精确度到底又多高.如果你在做会计报表,你需要非常的精确.如果你做一个网 ...

  2. Visual studio代码行数统计

    Visual studio代码行数统计 Visual Studio中的搜索功能支持正则表达式(虽然语法比较诡异),我们完全可以通过正则表达式来遍历整个解决方案从而获得代码行数. ^:b*[^:b#/] ...

  3. phpstorm统计程序行数_Python 实现代码行数统计

    快来算一算你写了多少行代码 前面我们一直在介绍图形界面,这次换个口味,在命令行实现代码行数统计程序.本程序共 135 行,其中 18 行空行.110 行有效代码.7行注释,大小为 7.71 KB. 主 ...

  4. python显示代码行数_python实现的代码行数统计代码

    python实现的代码行数统计代码 ''' Author: liupengfei Function: count lines of code in a folder iteratively Shell ...

  5. cloc工具 linux,Linux下源代码行数统计工具(sloccount,cloc等)

    在windows下总是有很多源代码统计工具, 比如SourceCounter(源代码统计精灵)等工具 之前我总是使用如下命令统计源代码的信息, 繁琐而可读性差 find . -type f -name ...

  6. python 代码行数统计工具_使用Python设计一个代码统计工具

    问题 设计一个程序,用于统计一个项目中的代码行数,包括文件个数,代码行数,注释行数,空行行数.尽量设计灵活一点可以通过输入不同参数来统计不同语言的项目,例如: # type用于指定文件类型 pytho ...

  7. 一行shell命令实现代码行数统计

    一行命令实现代码行数统计     1. 基本版 find . -name "*.cpp"|xargs wc -l|grep "total"|awk '{prin ...

  8. cloc工具 linux,Linux下源代码行数统计工具(sloccount, cloc等)

    在windows下总是有很多源代码统计工具, 比如SourceCounter(源代码统计精灵)等工具 之前我总是使用如下命令统计源代码的信息, 繁琐而可读性差 find . -type f -name ...

  9. 字符串处理算法(五)多线程实现代码行数统计。[风林火山]

    实现如下: //文件类型 enum E_FILETYPE {E_C,E_JAVA };//文件行数信息 struct T_CodeFileMsg {int nTaskId; //任务Idstring ...

最新文章

  1. 千亿参数大模型时代,QQ浏览器团队十亿级小模型「摩天」登顶CLUE
  2. 文件保存,String与int转换。
  3. linux su无效_如何处理Linux中su命令无反应的情况
  4. boost::hana::extract用法的测试程序
  5. 基因表达式编程gep_基因表达式编程GEP— 前言
  6. OceanBase开源,11张图带你了解分布式数据库的核心知识
  7. dp线长什么样子_HDMI、VGA、DVI、DP接口知识,史上最全面最通俗易懂对比分析!...
  8. 最近几年出现的新技术
  9. CSS, JavaScript 压缩, 美化, 加密, 解密
  10. [MDK]MDK通杀版注册机(更新最新的注册机,支持5.15, 5.16, 5.17,5.18,5.20,5.21, 5.22,5.23,5.24)
  11. 丹佛大学计算机专业,丹佛大学计算机工程排名第79(2020年TFE美国排名)
  12. 这十年,阿里开发者毕玄的日常
  13. HttpClient发送请求时动态替换目标ip
  14. 李宏毅机器学习L6 GAN
  15. python头像转卡通_Python实现将照片变成卡通图片的方法【基于opencv】
  16. 软件打开文件夹后闪退
  17. eclipse自动排版快捷键 按了没有用 的解决办法
  18. 传智播客凭什么改变IT教育
  19. 快速将argparse的参数倒入到类中的__dict__
  20. 战“疫”进行时,企业远程办公指南

热门文章

  1. 为什么看好云计算?2021全球IT行业十大预测告诉你!
  2. 变电站通信网络和系统协议IEC61850介绍
  3. 微软惟一许可的美化软件 让XP更像Vista
  4. SPDIF 色差输出 视频输出 S-Video YUV YCbCr YPbPr RGB VGA WXGA 分别的详细介绍 视频方式接口简介
  5. win10管理员账户改名(win10电脑账户改名)
  6. CodeCombat代码全记录(Python学习利器)--边地森林(第二章)代码12
  7. 大模型 LLM 综述, A Survey of Large Language Models
  8. 05 文件和数据格式化
  9. Format格式化输出,最容易忽略的坑!
  10. discuz mobile 接口加载过程