mysql table_rows统计

查元数据表,有时候不准,因为统计信息的缘故,表的量到了千万级别了,查 information_schema.tables非常不准,于是自己写了一个函数,一次统计统计自己需要的表的行数。

因为要估算添加索引的耗时,我的表都是类似这种,t_user_message_0,t_user_message_1,t_user_message_2,t_user_message_xxx,因为有规律,且数据多,有200张左右,写一个批量运行select count(*) from xx;

这种且插入到一张表(顺便放一列显示最近半年数据看占比多少),得出每张表的数据量。

(1)创建存储表行数的表:

CREATE TABLE `tb_rows` (
  `id` int NOT NULL AUTO_INCREMENT,
  `col1` int DEFAULT NULL,
  `col2` int DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4

(2)创建函数收集表行数:

复制代码
create
    definer = devops@`%` procedure fn_table_rows_im2()
begin
    declare userMessageIndex int default 0;
    declare messageIndex int default 0;
    declare commond_sql varchar(5000);
    while(userMessageIndex < 300) do
        set messageIndex = 0;
        begin
            while (messageIndex < 1) doset commond_sql = concat(' insert into tb_rows(col1,col2)select count(*),count(case when _dt>=date_add(curdate(),interval -6 month) then 1 end)col2',' from ','t_user_message_',userMessageIndex);
                set @sql = commond_sql;
                PREPARE stmt FROM @sql;         -- 预处理动态sql语句
                EXECUTE stmt ;                        -- 执行sql语句
                deallocate prepare stmt;      -- 释放prepare
                set messageIndex = messageIndex + 1;  
            end while;
        end;
        set userMessageIndex = userMessageIndex + 1;
    end while;
end;
复制代码

最后运行结束直接查tb_rows就行了。

 

posted @   5sdba  阅读(913)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示