如何查看数据库表的磁盘占用情况
·
查看数据库磁盘占用情况的方法因数据库类型(MySQL/PostgreSQL/Oracle)不同而略有差异,其中你之前操作的是MySQL,下面我会以MySQL为核心,结合系统层面和数据库内置方法,给出清晰、可操作的步骤,同时补充其他主流数据库的简要方法。
一、MySQL 查看磁盘占用(重点)
MySQL的磁盘占用主要包含:数据文件、日志文件、索引文件、临时文件等,可通过「系统命令」和「MySQL内置查询」两种方式查看。
1. 系统层面:查看MySQL数据目录的磁盘占用
MySQL的数据默认存储在 /var/lib/mysql(Linux)或 C:\ProgramData\MySQL\MySQL Server X.X\Data(Windows),先通过系统命令查看整体占用:
# 1. 查看磁盘整体挂载情况(确认数据盘剩余空间)
df -h
# 2. 查看MySQL数据目录总占用(替换为你的MySQL数据目录)
du -sh /var/lib/mysql/
# 3. 查看MySQL数据目录下各数据库的占用(按大小排序)
du -h --max-depth=1 /var/lib/mysql/ | sort -hr
2. MySQL内置查询:精准查看库/表级磁盘占用
通过 information_schema 系统库的 TABLES 表(存储表的元数据),可以精准查询单个库、单个表的磁盘占用(包含数据+索引)。
(1)查看单个数据库的总占用
-- 替换为你要查询的数据库名(如agent_qcs)
SELECT
TABLE_SCHEMA AS '数据库名',
CONCAT(ROUND(SUM(DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024, 2), ' MB') AS '总占用大小',
CONCAT(ROUND(SUM(DATA_LENGTH) / 1024 / 1024, 2), ' MB') AS '数据大小',
CONCAT(ROUND(SUM(INDEX_LENGTH) / 1024 / 1024, 2), ' MB') AS '索引大小'
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'agent_qcs' -- 数据库名
GROUP BY TABLE_SCHEMA;
(2)查看单个数据库中各表的磁盘占用(按大小排序)
-- 替换为你要查询的数据库名
SELECT
TABLE_NAME AS '表名',
CONCAT(ROUND((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024, 2), ' MB') AS '总占用大小',
CONCAT(ROUND(DATA_LENGTH / 1024 / 1024, 2), ' MB') AS '数据大小',
CONCAT(ROUND(INDEX_LENGTH / 1024 / 1024, 2), ' MB') AS '索引大小'
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'agent_qcs' -- 数据库名
ORDER BY (DATA_LENGTH + INDEX_LENGTH) DESC;
(3)查看所有数据库的磁盘占用(按大小排序)
SELECT
TABLE_SCHEMA AS '数据库名',
CONCAT(ROUND(SUM(DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024, 2), ' MB') AS '总占用大小'
FROM information_schema.TABLES
GROUP BY TABLE_SCHEMA
ORDER BY SUM(DATA_LENGTH + INDEX_LENGTH) DESC;
3. 查看MySQL日志文件的占用(可选)
MySQL的日志(慢查询日志、二进制日志、错误日志)也会占用磁盘,可通过以下方式查看:
# 查看二进制日志(binlog)大小(替换日志目录)
du -h /var/lib/mysql/mysql-bin.*
# 查看慢查询日志大小(先通过my.cnf找到慢查询日志路径)
grep 'slow_query_log_file' /etc/my.cnf
du -h /var/log/mysql/slow.log
二、PostgreSQL 查看磁盘占用
-- 查看单个数据库大小
SELECT
datname AS "数据库名",
pg_size_pretty(pg_database_size(datname)) AS "占用大小"
FROM pg_database
ORDER BY pg_database_size(datname) DESC;
-- 查看单个表大小(包含索引)
SELECT
relname AS "表名",
pg_size_pretty(pg_total_relation_size(relname)) AS "总占用大小"
FROM pg_stat_user_tables
WHERE schemaname = 'public' -- 模式名
ORDER BY pg_total_relation_size(relname) DESC;
三、Oracle 查看磁盘占用
-- 查看表空间占用
SELECT
tablespace_name AS "表空间名",
total_size / 1024 / 1024 AS "总大小(MB)",
used_size / 1024 / 1024 AS "已用大小(MB)",
free_size / 1024 / 1024 AS "剩余大小(MB)",
ROUND(used_size / total_size * 100, 2) AS "使用率(%)"
FROM (
SELECT
t.tablespace_name,
SUM(t.bytes) AS total_size,
SUM(t.bytes) - SUM(f.bytes) AS used_size,
SUM(f.bytes) AS free_size
FROM dba_data_files t
LEFT JOIN dba_free_space f ON t.tablespace_name = f.tablespace_name
GROUP BY t.tablespace_name
);
总结
- MySQL核心方法:系统层面用
df -h/du -sh看整体,数据库内用information_schema.TABLES查库/表级占用; - 关键指标:区分「数据大小」和「索引大小」,索引通常会占10%-50%的总空间;
- 排查重点:若磁盘占用突增,优先检查大表、二进制日志(binlog)或慢查询日志。
这些方法都是行业通用的最佳实践,命令可直接复制执行,新手只需替换对应的数据库名/目录路径即可。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)