一、查询所有表的条数
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();

1312

被折叠的 条评论
为什么被折叠?



