确定哪个表在 MySQL 中占用最多的磁盘空间

Posted

技术标签:

【中文标题】确定哪个表在 MySQL 中占用最多的磁盘空间【英文标题】:Determine which table takes most disk space in MySQL 【发布时间】:2011-01-28 00:50:25 【问题描述】:

确定哪个表占用磁盘空间最多的最简单方法是什么?

一个障碍:我没有 mysql 服务器,只有包含所有数据的文件 (dump.sql)

【问题讨论】:

【参考方案1】:

您可能想要download MySQL server,将其安装在您的本地主机上,import the dump file,然后使用:

SELECT   table_schema, 
         table_name, 
         data_length, 
         index_length 
FROM     information_schema.tables
ORDER BY data_length DESC;

【讨论】:

我告诉我搜索一个没有 MySQL 服务器的解决方案,我只对文本处理想法感兴趣 @astropanic:是的,但是为什么不能在本地机器上安装呢?每个平台都有一个 MySQL 版本,它可以在几分钟内安装。您也可以将其安装在 VM 中。【参考方案2】:

如果您使用的是 linux,则可以扫描转储文件以查找最长的行,这可能(也可能不是!)是最大的表,具体取决于索引、结构等,但如果您使用它,这将是一个不错的猜测无法启动服务器。

awk '  if ( length > L )  L=length ;s=$0  END print L,"\""s"\"" ' /root/sql/_common.all.301009.sql  | cut -c 1-100

这将显示最长行的前 100 个字符。例如,如果您的转储文件中的每个表有多个插入(使用--extended-insert--opt 选项),这可能不起作用。

【讨论】:

【参考方案3】:

一个快速的解决方案可能是对转储中的每个表执行类似的操作:

cat dump.sql | grep -i '^INSERT INTO `table1`' | wc -c

(希望你使用的是Linux,否则你可以安装Cygwin来获得windows系统上linux命令行的一些功能)

此命令将过滤掉特定表的转储中的插入语句,并打印出这些过滤后的插入语句的总字节数。当然,插入语句的大小与表中存储行的大小不同,但如果您只需要确定哪个表(可能)最大,这可能是一个很好的近似值。

【讨论】:

您需要将转储文件预处理到单独的表中才能使用此命令 - 它只会以这种形式输出总字符数 这就是为什么在catwc -c 命令之间有grep 命令。这将在运行中创建这样一个“个人”转储...... 我不明白这是如何工作的,当我执行时我只得到所有行的字符总和? 当您只执行命令cat dump.sql | grep -i '^INSERT INTO table1' 的第一部分时,您应该只看到以“INSERT INTO table1”开头的行,而没有以“INSERT INTO table2 或类似的东西”开头的行. 这些语句被过滤。wc -c 然后只显示匹配行的字节。

以上是关于确定哪个表在 MySQL 中占用最多的磁盘空间的主要内容,如果未能解决你的问题,请参考以下文章

Redshift 表在生产集群中占用的磁盘空间呈指数增长

linux清理磁盘空间

linux清理磁盘空间

磁盘空间分析小计

linux下查看磁盘空间占用

linux系统 磁盘空间被占用99%,想查找系统中哪一个文件占用的容量最大,怎样用命令呢