如何获取MySQL数据库表的大小?


900

我可以运行此查询来获取MySQL数据库中所有表的大小:

show table status from myDatabaseName;

我希望对了解结果有所帮助。我正在寻找尺寸最大的桌子。

我应该看哪一列?


8
你是什​​么意思?行数?磁盘上占用的字节数?
Mark Byers 2012年

@Mark我想要磁盘上的大小是正确的方法吗?#du -sh /mnt/mysql_data/openx/f_scraper_banner_details.MYI 79G /mnt/mysql_data/openx/f_scraper_banner_details.MYI
Ashish

3
相关的,如果有兴趣,我在此Answer中编写了一个Describe All Tables
提请

Answers:


1957

您可以使用此查询显示表的大小(尽管您需要先替换变量):

SELECT 
    table_name AS `Table`, 
    round(((data_length + index_length) / 1024 / 1024), 2) `Size in MB` 
FROM information_schema.TABLES 
WHERE table_schema = "$DB_NAME"
    AND table_name = "$TABLE_NAME";

或此查询以列出每个数据库中每个表的大小,从大到大:

SELECT 
     table_schema as `Database`, 
     table_name AS `Table`, 
     round(((data_length + index_length) / 1024 / 1024), 2) `Size in MB` 
FROM information_schema.TABLES 
ORDER BY (data_length + index_length) DESC;

3
谢谢您,它的工作还不错,尽管我不确定是否需要考虑Blobs。
大卫,

5
注意,您也可以使用“ IN”来指定多个表,例如AND table_name IN ('table_1', 'table_2', 'table_3');
David Thomas

6
AFAICT,这只会正确计算静态大小字段的长度。您将如何计数VARCHARBLOB键入?
l0b0 2014年

3
@kasimir在某些时候,世界感到困惑,一些标准组织和硬件制造商决定最好在十进制系统上定义一个千字节。现在,IEC标准将基数2 KB(1024字节)称为kib(KiB)。无论如何,MySQL不知道,所以如果你想IEC小数千字节,除以1000
russellpierce

9
这对InnoDB存储引擎有效吗?根据这里的mysql文档-dev.mysql.com/doc/refman/5.7/en/show-table-status.html,该引擎的data_length字段包含聚集索引的大小。那将不能正确表示数据的大小。会吗
euphoria83

96
SELECT TABLE_NAME AS "Table Name", 
table_rows AS "Quant of Rows", ROUND( (
data_length + index_length
) /1024, 2 ) AS "Total Size Kb"
FROM information_schema.TABLES
WHERE information_schema.TABLES.table_schema = 'YOUR SCHEMA NAME/DATABASE NAME HERE'
LIMIT 0 , 30

您可以从“ information_schema ”-> SCHEMATA表->“ SCHEMA_NAME ”列中获取模式名称


其他 您可以按如下方式获取mysql数据库的大小

SELECT table_schema "DB Name", 
Round(Sum(data_length + index_length) / 1024 / 1024, 1) "DB Size in MB" 
FROM   information_schema.tables 
GROUP  BY table_schema; 

结果

DB Name              |      DB Size in MB

mydatabase_wrdp             39.1
information_schema          0.0

您可以在此处获得更多详细信息。


41
SELECT 
    table_name AS "Table",  
    round(((data_length + index_length) / 1024 / 1024), 2) as size   
FROM information_schema.TABLES  
WHERE table_schema = "YOUR_DATABASE_NAME"  
ORDER BY size DESC; 

这将对大小进行排序(以MB为单位的数据库大小)。


31

如果要查询使用当前选择的数据库。只需复制粘贴此查询即可。(无需修改)

SELECT table_name ,
  round(((data_length + index_length) / 1024 / 1024), 2) as SIZE_MB
FROM information_schema.TABLES
WHERE table_schema = DATABASE() ORDER BY SIZE_MB DESC;

5
甚至更短(没有子查询):SELECT table_name,round((((data_length + index_length)/ 1024/1024),2)SIZE_MBFROM information_schema.TABLES WHERE table_schema = DATABASE()ORDER BY((data_length + index_length)ASC;
Onkeltem

15

有一种使用Workbench来获取许多信息的简单方法:

  • 右键单击架构名称,然后单击“架构检查器”。

  • 在出现的窗口中,您有许多选项卡。第一个标签“信息”显示了数据库大小的粗略估计(以MB为单位)。

  • 第二个标签“表格”显示每个表格的数据长度和其他详细信息。


我的Mac客户端版本6.0.9上没有“信息”标签
尼尔

大!!!在MySQL Workbench中,每个表还有一个“表检查器”。速度不太快,但是非常方便!
T30年

11
  • 所有表格的大小:

    假设您的数据库或TABLE_SCHEMA名称为“ news_alert”。然后,此查询将显示数据库中所有表的大小。

    SELECT
      TABLE_NAME AS `Table`,
      ROUND(((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024),2) AS `Size (MB)`
    FROM
      information_schema.TABLES
    WHERE
      TABLE_SCHEMA = "news_alert"
    ORDER BY
      (DATA_LENGTH + INDEX_LENGTH)
    DESC;

    输出:

        +---------+-----------+
        | Table   | Size (MB) |
        +---------+-----------+
        | news    |      0.08 |
        | keyword |      0.02 |
        +---------+-----------+
        2 rows in set (0.00 sec)
  • 对于特定表:

    假设您TABLE_NAME“新闻”。然后,SQL查询将是-

    SELECT
      TABLE_NAME AS `Table`,
      ROUND(((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024),2) AS `Size (MB)`
    FROM
      information_schema.TABLES
    WHERE
        TABLE_SCHEMA = "news_alert"
      AND
        TABLE_NAME = "news"
    ORDER BY
      (DATA_LENGTH + INDEX_LENGTH)
    DESC;

    输出:

    +-------+-----------+
    | Table | Size (MB) |
    +-------+-----------+
    | news  |      0.08 |
    +-------+-----------+
    1 row in set (0.00 sec)

8

尝试使用以下shell命令(替换DB_NAME为您的数据库名称):

mysql -uroot <<<"SELECT table_name AS 'Tables', round(((data_length + index_length) / 1024 / 1024), 2) 'Size in MB' FROM information_schema.TABLES WHERE table_schema = \"DB_NAME\" ORDER BY (data_length + index_length) DESC;" | head

对于Drupal / drush解决方案,请检查以下示例脚本,该脚本将显示正在使用的最大表:

#!/bin/sh
DB_NAME=$(drush status --fields=db-name --field-labels=0 | tr -d '\r\n ')
drush sqlq "SELECT table_name AS 'Tables', round(((data_length + index_length) / 1024 / 1024), 2) 'Size in MB' FROM information_schema.TABLES WHERE table_schema = \"${DB_NAME}\" ORDER BY (data_length + index_length) DESC;" | head -n20

6

这是使用bash命令行解决此问题的另一种方法。

for i in mysql -NB -e 'show databases'; do echo $i; mysql -e "SELECT table_name AS 'Tables', round(((data_length+index_length)/1024/1024),2) 'Size in MB' FROM information_schema.TABLES WHERE table_schema =\"$i\" ORDER BY (data_length + index_length) DESC" ; done


6

如果您使用的是phpmyadmin,则只需转到表结构

例如

Space usage
Data    1.5 MiB
Index   0   B
Total   1.5 Mi

4

根据ChapMic的回答改编以适合我的特殊需求。

仅指定您的数据库名称,然后按降序对所有表进行排序-从所选数据库中的LARGEST到SMALLEST表。只需要替换1个变量=您的数据库名称。

SELECT 
table_name AS `Table`, 
round(((data_length + index_length) / 1024 / 1024), 2) AS `size`
FROM information_schema.TABLES 
WHERE table_schema = "YOUR_DATABASE_NAME_HERE"
ORDER BY size DESC;

3

如果您有ssh访问权限,则可能还想尝试一下du -hc /var/lib/mysql(或datadir设置为,也可以不同my.cnf)。


最后,一个不依赖于information_schema的答案。以我为例,它报告为660MB,而文件系统的实际大小为
1.8GB

2

显示行数和占用空间以及排序的另一种方式。

SELECT
     table_schema as `Database`,
     table_name AS `Table`,
     table_rows AS "Quant of Rows",
     round(((data_length + index_length) / 1024 / 1024/ 1024), 2) `Size in GB`
FROM information_schema.TABLES
WHERE table_schema = 'yourDatabaseName'
ORDER BY (data_length + index_length) DESC;  

您必须在此查询中替换的唯一字符串是“ yourDatabaseName”。


2

我发现现有答案实际上并没有给出磁盘上表的大小,这会更有帮助。与基于data_length和index的表大小相比,此查询可提供更准确的磁盘估计。我必须将其用于无法物理检查磁盘和检查文件大小的AWS RDS实例。

select NAME as TABLENAME,FILE_SIZE/(1024*1024*1024) as ACTUAL_FILE_SIZE_GB
, round(((data_length + index_length) / 1024 / 1024/1024), 2) as REPORTED_TABLE_SIZE_GB 
from INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES s
join INFORMATION_SCHEMA.TABLES t 
on NAME = Concat(table_schema,'/',table_name)
order by FILE_SIZE desc

1

最后计算数据库的总大小:

(SELECT 
  table_name AS `Table`, 
  round(((data_length + index_length) / 1024 / 1024), 2) `Size in MB` 
  FROM information_schema.TABLES 
  WHERE table_schema = "$DB_NAME"
)
UNION ALL
(SELECT 
  'TOTAL:',
  SUM(round(((data_length + index_length) / 1024 / 1024), 2) )
  FROM information_schema.TABLES 
  WHERE table_schema = "$DB_NAME"
)

1
SELECT TABLE_NAME AS table_name, 
table_rows AS QuantofRows, 
ROUND((data_length + index_length) /1024, 2 ) AS total_size_kb 
FROM information_schema.TABLES
WHERE information_schema.TABLES.table_schema = 'db'
ORDER BY (data_length + index_length) DESC; 

以上所有2个都在mysql上进行了测试


1

这应该在mysql而不是postgresql中进行测试:

SELECT table_schema, # "DB Name", 
Round(Sum(data_length + index_length) / 1024 / 1024, 1) # "DB Size in MB" 
FROM   information_schema.tables 
GROUP  BY table_schema; 

尽管这可以回答作者的问题,但缺少一些解释性的单词和/或指向文档的链接。没有一些原始短语的话,原始代码片段不是很有用。您可能还会发现如何写一个好的答案很有帮助。请编辑您的答案- 点评来源
尼克

@尼克为什么仍然被禁止?
威廉

抱歉,我不知道答案-我不是主持人。
尼克,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.