刚开始统计数据库中有多少行数据的时候,使用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. ​Rust最受喜爱却少有人用,Python仅排第六,2021全球开发者调查报告出炉
  2. rabbitmq 学习-9- RpcClient发送消息和同步接收消息原理
  3. Windows勾子处理类Thook 以及示例
  4. php mysql 迁移_将phpstudy中的mysql迁移至Linux教程
  5. java asynctask完成_如何传递参数并从AsyncTask类中获取结果?
  6. python流处理框架_Python操作分布式流处理系统Kafka
  7. php定义一个学生类_3分钟短文 | PHP获取函数参数名,和类定义的常量,都要反射...
  8. linux 安装php7.3
  9. Python openpyxl文档
  10. 【汇编】从键盘输入16位有符号数x,y,z,w,编写程序实现:w=x+ y+24 - z,结果存放在w中, 并显示结果。
  11. 谷歌浏览器启动页被篡改为hao.7654.com的解决办法
  12. win10右键英特尔显卡控制面板不见了(如何打开英特尔® 显卡的控制面板 )
  13. 计算机组成原理中各种校验码,计算机组成原理保姆级复习资料
  14. 《缠中说禅108课》63:替各位理理基本概念
  15. GIF 斗图警告!GitHub 标星 5.5k+,Sorry 会编程就是可以 为所欲为!
  16. js URLEncode函数
  17. PMP成本管理中的几个英文缩写
  18. 复数和向量的函数运算
  19. 我要学编程,看什么书好?--^_^,这里推荐一些个人觉得很不错的书(五)小集篇
  20. 手机如何将Word文档转换为PDF扫描文件

热门文章

  1. 压缩空气储能研究(Matlab代码)
  2. 你了解的计算机网络知识有哪些?
  3. 相关性、平均值、标准差、相关系数、回归线及最小二乘法
  4. P2P平台的羊毛党还可以“薅”多久?
  5. 森林资源调查 |基于无人机平台应用激光雷达技术获取树木信息 (包含位置、树高、树冠直径、树冠面积和树冠体积等)
  6. Optional long parameter ‘beginDateLong’ is present but cannot be translated into a null value due to
  7. 【python】Decimal的使用
  8. 表单form action的url写法,/在前台和后台的定义
  9. 极客日报第 78 期:Linux 之父家断电六天:内核更新延期;华为 EMUI 11 用户突破1亿;美国得州最大电力公司申请破产
  10. 19.python-多态