如何确定特定MySQL表占用多少磁盘空间?

时间:2011-06-24 23:03:01

标签: mysql

有没有快速的方法来确定特定MySQL表占用多少磁盘空间?该表可能是MyISAM或Innodb。

9 个答案:

答案 0 :(得分:279)

对于表格mydb.mytable,请执行以下操作:

BYTES

SELECT (data_length+index_length) tablesize
FROM information_schema.tables
WHERE table_schema='mydb' and table_name='mytable';

KILOBYTES

SELECT (data_length+index_length)/power(1024,1) tablesize_kb
FROM information_schema.tables
WHERE table_schema='mydb' and table_name='mytable';

MEGABYTES

SELECT (data_length+index_length)/power(1024,2) tablesize_mb
FROM information_schema.tables
WHERE table_schema='mydb' and table_name='mytable';

GIGABYTES

SELECT (data_length+index_length)/power(1024,3) tablesize_gb
FROM information_schema.tables
WHERE table_schema='mydb' and table_name='mytable';

GENERIC

这是一个通用查询,其中最大单位显示为TB(TeraBytes)

SELECT 
    CONCAT(FORMAT(DAT/POWER(1024,pw1),2),' ',SUBSTR(units,pw1*2+1,2)) DATSIZE,
    CONCAT(FORMAT(NDX/POWER(1024,pw2),2),' ',SUBSTR(units,pw2*2+1,2)) NDXSIZE,
    CONCAT(FORMAT(TBL/POWER(1024,pw3),2),' ',SUBSTR(units,pw3*2+1,2)) TBLSIZE
FROM
(
    SELECT DAT,NDX,TBL,IF(px>4,4,px) pw1,IF(py>4,4,py) pw2,IF(pz>4,4,pz) pw3
    FROM 
    (
        SELECT data_length DAT,index_length NDX,data_length+index_length TBL,
        FLOOR(LOG(IF(data_length=0,1,data_length))/LOG(1024)) px,
        FLOOR(LOG(IF(index_length=0,1,index_length))/LOG(1024)) py,
        FLOOR(LOG(IF(data_length+index_length=0,1,data_length+index_length))/LOG(1024)) pz
        FROM information_schema.tables
        WHERE table_schema='mydb'
        AND table_name='mytable'
    ) AA
) A,(SELECT 'B KBMBGBTB' units) B;

试一试!!!

答案 1 :(得分:12)

快速获取SQL的前20个最大表格。

SELECT table_schema, table_name,
  ROUND((data_length+index_length)/POWER(1024,2),2) AS tablesize_mb
FROM information_schema.tables
ORDER BY tablesize_mb DESC LIMIT 20;

希望对某人有用!

答案 2 :(得分:10)

这对InnoDB表来说不准确。磁盘上的大小实际上大于通过查询报告的大小。

请参阅Percona的链接以获取更多信息。

http://www.mysqlperformanceblog.com/2008/12/16/how-much-space-does-empty-innodb-table-take/

答案 3 :(得分:2)

在linux中默认安装了mysql:

[you@yourbox]$ ls -lha /var/lib/mysql/<databasename>

基于NIXCRAFT's mysql db location

答案 4 :(得分:1)

根据RolandMySQLDBA的回答,我认为我们可以使用上面的方法来获取表格中每个模式的大小:

SELECT table_schema, SUM((data_length+index_length)/power(1024,1)) tablesize_kb 
    FROM information_schema.tables GROUP BY table_schema;

真的很喜欢它!

答案 5 :(得分:0)

取自How do I check how much disk space my database is using?

  

您可以通过查看phpMyAdmin来查看MySQL表格大小   通过单击左框架中的数据库名称来控制面板   并在右边框架中读取那里桌子的大小。

以下查询也有助于在bytes

中获取相同的信息
select SUM(data_length) + SUM(index_length) as total_size 
from information_schema.tables 
where table_schema = 'db_name' 
and table_name='table_name';

答案 6 :(得分:0)

您可以查看文件的大小......

每个表都存储在一个文件夹内的几个单独的文件中,该文件夹名为数据库。这些文件夹存储在mysql数据目录中。

从那里你可以做一个'du -sh。*'来获取磁盘上表的大小。

答案 7 :(得分:0)

上面的大多数答案对于 InnoDB 表都是不准确的。您可以轻松复制这一点。

向表中添加 10,000 条虚拟记录,并运行上述建议的查询。然后使用删除命令(不截断)删除所有 10,000 条记录。

再次运行上面建议的查询,您会看到大小不是 0。

磁盘上的文件只会增长,即使删除数据也不会缩小。如果要缩小,则需要截断或运行诸如 OPTIMIZE TABLE 之类的东西。

似乎没有可靠的方法可以知道 InnoDB 表记录真正消耗了多少空间。即使磁盘上的文件显示为 100MB,DB 中的实际记录也可能为 0。

答案 8 :(得分:-1)

我会使用&#39; mysqldiskusage&#39;工具如下

$ mysqldiskusage --server=user:password@localhost mydbname
# Source on localhost: ... connected.

# Database totals:
+------------+----------------+
| db_name    |         total  |
+------------+----------------+
| mydbaname  | 5,403,033,600  |
+------------+----------------+

Total database disk usage = 5,403,033,600 bytes or 5.03 GB