插件窝 干货文章 mysql怎么查询所有表的数据量

mysql怎么查询所有表的数据量

table COUNT 方法 SCHEMA 799    来源:    2025-03-27

MySQL查询所有表的数据量

在MySQL中,有几种方法可以查询数据库中所有表的数据量(行数)。以下是几种常用的方法:

方法1:使用INFORMATION_SCHEMA.TABLES

SELECT 
    table_name, 
    table_rows 
FROM 
    information_schema.tables 
WHERE 
    table_schema = '你的数据库名'
ORDER BY 
    table_rows DESC;

注意:这种方法获取的行数是近似值,对于InnoDB表可能不精确,因为InnoDB不实时维护行数统计。

方法2:为每个表执行COUNT(*)查询(更精确)

SELECT 
    CONCAT('SELECT ''', table_name, ''' AS table_name, COUNT(*) AS row_count FROM ', table_name, ' UNION ALL') 
FROM 
    information_schema.tables 
WHERE 
    table_schema = '你的数据库名' 
    AND table_type = 'BASE TABLE';

执行上述查询会生成一个SQL语句,你可以复制并执行这个生成的SQL来获取精确的行数。

方法3:使用存储过程

DELIMITER //
CREATE PROCEDURE count_all_rows()
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE table_name VARCHAR(255);
    DECLARE cur CURSOR FOR SELECT table_name FROM information_schema.tables WHERE table_schema = DATABASE();
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

    CREATE TEMPORARY TABLE IF NOT EXISTS table_row_counts (
        table_name VARCHAR(255),
        row_count INT
    );

    OPEN cur;

    read_loop: LOOP
        FETCH cur INTO table_name;
        IF done THEN
            LEAVE read_loop;
        END IF;

        SET @sql = CONCAT('INSERT INTO table_row_counts SELECT ''', table_name, ''', COUNT(*) FROM ', table_name);
        PREPARE stmt FROM @sql;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
    END LOOP;

    CLOSE cur;

    SELECT * FROM table_row_counts ORDER BY row_count DESC;
    DROP TEMPORARY TABLE table_row_counts;
END //
DELIMITER ;

-- 调用存储过程
CALL count_all_rows();

方法4:使用shell脚本(如果从外部访问)

mysql -u用户名 -p密码 -e "USE 数据库名; SHOW TABLES;" | grep -v Tables_in | while read table; do echo -n "$table: "; mysql -u用户名 -p密码 -e "USE 数据库名; SELECT COUNT(*) FROM $table;" | grep -v COUNT; done

注意事项

  1. 对于大型数据库,COUNT(*)操作可能会很慢
  2. INFORMATION_SCHEMA方法快速但不精确
  3. 精确方法可能需要很长时间执行,特别是对于大表
  4. 在生产环境中执行大量COUNT查询可能会影响性能

选择哪种方法取决于你对精确度的需求以及数据库的大小。