MySQL数据库存储与数据统计

MySQL数据库存储与数据统计相关查询实践

在日常的数据库管理与开发工作中,我们常常需要了解数据库及表的存储情况,以及统计数据的行数等信息。本文将结合实际的SQL查询语句,分享如何在MySQL中实现这些功能。

一、查询表的存储信息

1. 查询单个表的存储总量、数据大小和索引大小

有时候我们想要知道某个特定表占用了多少磁盘空间,包括数据部分和索引部分。通过以下SQL语句可以实现:

SELECT 
    table_name AS '表名',
    ROUND(((data_length + index_length) / 1024 / 1024 / 1024), 2) AS '总大小(GB)',
    ROUND((data_length / 1024 / 1024 / 1024), 2) AS '数据大小(GB)',
    ROUND((index_length / 1024 / 1024 / 1024), 2) AS '索引大小(GB)'
FROM 
    information_schema.tables
WHERE 
    table_schema = '数据库名'  -- 替换为实际数据库名
    AND table_name = '表名';  -- 替换为实际表名

上述语句从information_schema.tables表中获取信息,information_schema是MySQL自带的信息数据库,用于存储数据库元数据。table_schema指定数据库名,table_name指定表名。通过计算data_length(数据长度)和index_length(索引长度),并将其转换为GB单位,得到表的存储相关信息。

2. 查询每个数据库的每张表存储总量

如果我们想查看某个连接下,每个数据库里每张表的存储情况,可以使用下面的SQL:

SELECT 
    table_schema AS '数据库名',
    table_name AS '表名',
    ROUND(((data_length + index_length) / 1024 / 1024 / 1024), 2) AS '总大小(GB)',
    ROUND((data_length / 1024 / 1024 / 1024), 2) AS '数据大小(GB)',
    ROUND((index_length / 1024 / 1024 / 1024), 2) AS '索引大小(GB)'
FROM 
    information_schema.tables
ORDER BY 
    table_schema,  -- 按数据库名分组排序
    (data_length + index_length) DESC;  -- 每个数据库内按表大小降序排列

此语句不再对特定表进行限制,而是查询所有表的信息,并按照数据库名和表的总大小进行排序,方便我们直观地看到每个数据库中占用空间较大的表。

二、统计数据库中的数据行数

1. 精确统计单个表的数据行数

对于精确统计某个表的数据行数,我们可以使用SELECT COUNT(*)语句。例如,统计employment_situation数据库中lcsncldljyxztjb_all表的行数:

SELECT COUNT(*) AS '总行数'
FROM 数据库.表名;

这种方式会逐行扫描表,虽然对于数据量小的表性能影响不大,但当表数据量非常大时,执行速度会变慢,不过得到的结果是非常精确的。

2. 快速估算所有表的数据行数

如果我们不需要非常精确的行数统计,而是想快速得到一个大致的估算值,可以查询information_schema.TABLES表中的TABLE_ROWS字段:

SELECT 
    table_name AS '表名',
    table_rows AS '估算行数'
FROM 
    information_schema.tables
WHERE 
    table_schema = '数据库名';  -- 替换为实际数据库名

这里的TABLE_ROWS是MySQL存储引擎估算出来的值,比如InnoDB引擎的估算可能存在一定偏差(通常误差在10%以内),但查询速度非常快。

3. 统计整个数据库的总行数

当我们需要一次性统计某个数据库中所有表的总行数之和时,可以使用动态SQL来实现:

-- 生成统计语句
SELECT CONCAT(
    'SELECT \'Total Rows\' AS TableName, SUM(row_count) AS RowCount FROM (',
    GROUP_CONCAT(
        CONCAT(
            '(SELECT COUNT(*) AS row_count FROM `', 
            table_name, 
            '`)'
        ) 
        SEPARATOR ' UNION ALL '
    ),
    ') AS subquery;'
) INTO @sql
FROM information_schema.tables
WHERE table_schema = '数据库名';  -- 替换为实际数据库名

-- 执行动态生成的SQL
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

上述代码先通过CONCAT函数和GROUP_CONCAT函数动态生成包含多个SELECT COUNT(*)的SQL语句,然后使用PREPAREEXECUTEDEALLOCATE PREPARE来执行这条动态生成的SQL,从而得到整个数据库的总行数之和。

通过这些SQL查询,我们可以更好地了解MySQL数据库的存储和数据情况,有助于进行数据库的优化和管理工作。在实际应用中,我们可以根据具体需求和场景,灵活选择合适的查询方法。

希望本文能对大家在MySQL数据库相关操作上有所帮助,欢迎在评论区交流探讨。

你可能感兴趣的:(数据分析学习系列,数据库,mysql)