MySQL查询数据库所有表总条数

一、查询所有表的条数

MySQL数据库想查询数据库所有表的条数有多少,但是表过多的情况下使用SELECT COUNT(1) FROM TABLE 这样效率会很低,此时找到了MySQL自带的系统信息数据库 INFORMATION_SCHEMA 它不是存储业务数据的,而是存储了整个 MySQL 服务器中所有数据库的元数据(描述数据的数据),比如:

  • 数据库名、表名、列名
  • 表的类型、存储引擎、字符集
  • 索引信息、权限信息、表空间信息等

查询的语句是:

SELECT table_name,table_rows FROM information_schema.tables WHERE table_schema = '数据库名'  ;

但是table_rows 是 MySQL 统计的近似值,InnoDB 引擎下可能和实际行数有偏差,导致每张表的总条数都不一致,使用count一个一个表查效率又特别低,所以写了一个存储过程来执行,大概思路就是取 INFORMATION_SCHEMA 查询出来的表名,通过表名来每个表去count,然后将count的数据放到一个临时表中,然后再查询临时表就能整体列出每个表的数据条数了,查询完之后再将临时表DROP。

二、存储过程

--创建存储过程

DELIMITER //
CREATE PROCEDURE CountAllTablesRows()
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE tbl_name VARCHAR(255);
    DECLARE row_count_val INT; -- 存储每张表的行数
    -- 声明游标,查询指定数据库下的所有表名
    DECLARE cur CURSOR FOR 
        SELECT table_name 
        FROM information_schema.tables 
        WHERE table_schema = 'database' -- 替换为你的数据库名
          AND table_type = 'BASE TABLE'; -- 只统计普通表,排除视图等
    -- 声明异常处理:游标遍历完后设置done为TRUE
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
    
    -- 1. 创建临时表,用于汇总存储表名和行数(每次执行先清空)
    DROP TEMPORARY TABLE IF EXISTS temp_table_row_counts;
    CREATE TEMPORARY TABLE temp_table_row_counts (
        table_name VARCHAR(255) NOT NULL,
        row_count INT NOT NULL
    );
    
    OPEN cur;
    
    read_loop: LOOP
        FETCH cur INTO tbl_name;
        IF done THEN
            LEAVE read_loop;
        END IF;
        
        -- 2. 动态计算每张表的行数,并赋值到变量
        SET @s = CONCAT('SELECT COUNT(*) INTO @row_count FROM ', tbl_name);
        PREPARE stmt FROM @s;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
        
        -- 3. 将表名和行数插入临时表
        INSERT INTO temp_table_row_counts (table_name, row_count)
        VALUES (tbl_name, @row_count);
    END LOOP;
    
    CLOSE cur;
    
    -- 4. 一次性查询所有结果(核心:汇总展示)
    SELECT table_name, row_count FROM temp_table_row_counts;
    
    -- 可选:删除临时表(临时表会话结束会自动删除)
    DROP TEMPORARY TABLE IF EXISTS temp_table_row_counts;
END //
DELIMITER ;

存储过程创建成功后,通过查询存储过程查询表条数即可

#查询存储过程

call CountAllTablesRows();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Male晓

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值