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

How to get the sizes of the tables of a MySQL database?

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

1
show table status from myDatabaseName;

我想要一些帮助来理解结果。我在找最大尺寸的桌子。

我应该看哪一列?


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

1
2
3
4
5
6
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";

或者这个查询列出每个数据库中每个表的大小,最大的第一个:

1
2
3
4
5
6
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;


1
2
3
4
5
6
7
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 Table->"Schema_Name"列获取架构名称。

附加的您可以按如下方式获取MySQL数据库的大小。

1
2
3
4
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;

结果

1
2
3
4
DB Name              |      DB Size in MB

mydatabase_wrdp             39.1
information_schema          0.0

您可以在这里获得更多详细信息。


1
2
3
4
5
6
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;

这将对大小(db大小(MB))进行排序。


如果希望查询使用当前选定的数据库。只需复制粘贴此查询。(无需修改)

1
2
3
4
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;


使用工作台可以很容易地获得许多信息:

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

  • 在结果窗口中有许多选项卡。第一个选项卡"info"以MB为单位显示数据库大小的粗略估计。

  • 第二个选项卡"表"显示每个表的数据长度和其他详细信息。


假设您的数据库名是"新闻警报"。然后这个查询将显示数据库中所有表的大小。

所有表的大小:

1
2
3
4
5
6
7
8
9
10
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;

输出:

1
2
3
4
5
6
7
    +---------+-----------+
    | Table   | Size (MB) |
    +---------+-----------+
    | news    |      0.08 |
    | keyword |      0.02 |
    +---------+-----------+
    2 rows in set (0.00 sec)

对于特定表:

1
2
3
4
5
6
7
8
9
10
11
12
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;

输出:

1
2
3
4
5
6
+-------+-----------+
| Table | Size (MB) |
+-------+-----------+
| news  |      0.08 |
+-------+-----------+
1 row in set (0.00 sec)


尝试以下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解决方案,请检查以下示例脚本,该脚本将显示正在使用的最大表:

1
2
3
4
5
#!/bin/sh
DB_NAME=$(drush status --fields=db-name --field-labels=0 | tr -d '

 '
)
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

如果您使用phpmyadmin,那么只需转到表结构

例如

1
2
3
4
Space usage
Data    1.5 MiB
Index   0   B
Total   1.5 Mi

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


for i in mysql -NB -e 'show databases';do echo$i;mysql-e"选择表名为‘表’,取整((数据长度+索引长度)/1024/1024),2)‘大小(MB)’,来自信息schema.tables,其中表schema="$i"order by(数据长度+索引长度)desc";done< /代码>


根据Chapmic的回答改编,以满足我的特殊需求。

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

1
2
3
4
5
6
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;

显示所占行数和空间并按其排序的另一种方法。

1
2
3
4
5
6
7
8
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"。


我发现现有的答案实际上没有给出磁盘上表的大小,这更有用。与基于数据长度的表大小相比,此查询提供更准确的磁盘估计索引。我不得不将它用于一个AWS RDS实例,在这个实例中,您无法实际检查磁盘和检查文件大小。

1
2
3
4
5
6
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

如果您有ssh访问权,您可能只想尝试du -hc /var/lib/mysql(或不同的datadir,如您的my.cnf中设置的那样)。


计算结尾处数据库的总大小:

1
2
3
4
5
6
7
8
9
10
11
12
13
(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"
)

这应该在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;


16

以上2个都是在mysql上测试的