统计当前MySQL数据库中所有实体表的数据条数
CREATE DEFINER=`root`@`%` PROCEDURE `get_table_row_counts`(flag INT)
BEGIN
DECLARE done INT DEFAULT FALSE; #定义游标结束标志
DECLARE rows_number INT; #定义获取表的条
DECLARE table_name_str VARCHAR(255); #定义获取表名称
DECLARE total_rows INT DEFAULT 0; #定义总条数
#定义游标,获取当前数据库中所有的实体表
DECLARE cur CURSOR FOR SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_TYPE != 'VIEW';
#定义游标遍历结束时赋值给游标结束标志
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
DROP TEMPORARY TABLE IF EXISTS temp_table_names_rows;
-- 创建临时表,如果不存在
CREATE TEMPORARY TABLE IF NOT EXISTS temp_table_names_rows (table_name VARCHAR(255), row_count INT);
#打开游标
OPEN cur;
read_loop: LOOP
#从当前遍历数据中拿到表名
FETCH cur INTO table_name_str;
#判断是否到结束标志,到最后跳出遍历
IF done THEN
LEAVE read_loop;
END IF;
#判断当前标志,默认查询表条数的近似值速度快。
IF flag is NULL OR flag = 0 THEN
# 实际条数近似值,默认采用
SELECT IFNULL(TABLE_ROWS,0)
INTO rows_number
FROM INFORMATION_SCHEMA.TABLES
WHERE
TABLE_SCHEMA = DATABASE()
AND TABLE_TYPE != 'VIEW'
AND TABLE_NAME = table_name_str;
ELSE
#从具体表的中通过统计函数获取表的条数,速度慢
SET @rows_number_str = 0;
SET @sql = CONCAT(' SELECT COUNT(1) INTO @rows_number_str FROM ',table_name_str);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SELECT @rows_number_str INTO rows_number; -- 将动态 SQL 中设置的值赋回给存储过程中的变量
INSERT INTO temp_table_names_rows VALUES(table_name_str,IFNULL(rows_number,0));
END IF;
-- SELECT CONCAT(table_name, ': ', table_rows) AS table_row_info;
#条数累加
SET total_rows = total_rows + rows_number;
END LOOP;
#关闭游标
CLOSE cur;
#返回总条数
IF flag is NULL OR flag = 0 OR flag = 1 THEN
SELECT total_rows AS total_row_count;
ELSE
INSERT INTO temp_table_names_rows VALUES('合计:',total_rows);
SELECT * FROM temp_table_names_rows ORDER BY row_count;
END IF;
DROP TEMPORARY TABLE IF EXISTS temp_table_names_rows;
END
获取总条数的过程使用
1. 获取当前数据库所有表的总条数近似值
CALL get_table_row_counts(0);
查询结果:9084580 ,查询时间: 0.324s
2. 获取当前数据库所有表的总条数实际值
CALL get_table_row_counts(1);
查询结果:15628421 ,查询时间: 1.238s
3. 获取当前数据库所有表条数明细以及总条数实际值
CALL get_table_row_counts(2);
查询结果:15628421 ,查询时间: 1.238s