统计当前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);

image-aicy.png

查询结果:15628421 ,查询时间: 1.238s