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

JPa*_*shs 838 mysql

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

show table status from myDatabaseName;
Run Code Online (Sandbox Code Playgroud)

我想在理解结果方面提供一些帮助.我正在寻找最大尺寸的桌子.

我应该看哪一栏?

Cha*_*Mic 1838

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

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";
Run Code Online (Sandbox Code Playgroud)

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

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;
Run Code Online (Sandbox Code Playgroud)

  • 这适用于InnoDB存储引擎吗?根据mysql doc这里 - http://dev.mysql.com/doc/refman/5.7/en/show-table-status.html,该引擎的data_length字段包含聚集索引的大小.这将无法正确表示数据的大小.会吗? (7认同)
  • AFAICT,这只会正确计算静态大小字段的长度.你怎么算`VARCHAR`和`BLOB`类型? (6认同)
  • 注意,您也可以使用"IN"来指定多个表,例如`AND table_name IN('table_1','table_2','table_3');` (5认同)
  • 谢谢,它的工作正常,但我不确定是否需要考虑Blob. (3认同)
  • 您将 `SUM` 除以 1024 两次,从字节到千字节再到兆字节。这假设千字节包含 1024 字节,但 Mac OS 使用“十进制”系统,即 1 千字节 = 1000 字节 (http://en.wikipedia.org/wiki/Kilobyte)。因此,在这些系统上不应将“SUM”除以 1000 两次,还是 MySQL 以某种方式补偿/忽略了这一点? (2认同)
  • @kasimir 在某些时候,世界变得混乱,一些标准组织和硬件制造商认为最好在十进制系统上定义千字节。IEC 标准现在将基本的 2 KB(1024 字节)称为 kibibyte (KiB)。无论如何,MySQL 不知道,所以如果你想要 IEC 十进制千字节,除以 1000。 (2认同)
  • 例如,如果表中有 blob 字段,它确实不会告诉您正确的大小。LOB 页存储在外部页中,因此它们不计入聚集索引中。 (2认同)

Sum*_*han 90

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
Run Code Online (Sandbox Code Playgroud)

您可以从" 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; 
Run Code Online (Sandbox Code Playgroud)

结果

DB Name              |      DB Size in MB

mydatabase_wrdp             39.1
information_schema          0.0
Run Code Online (Sandbox Code Playgroud)

您可以在此处获取其他详细信息.


Gan*_*ank 38

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; 
Run Code Online (Sandbox Code Playgroud)

这会对大小进行排序(DB大小,以MB为单位).


zai*_*eer 26

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

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;
Run Code Online (Sandbox Code Playgroud)

  • 甚至更短(没有子查询):SELECT table_name,round(((data_length + index_length)/ 1024/1024),2)`SIZE_MB` FROM information_schema.TABLES WHERE table_schema = DATABASE()ORDER BY(data_length + index_length)ASC; (3认同)

小智 14

使用Workbench可以轻松获取许多信息:

  • 右键单击模式名称,然后单击"模式检查器".

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

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


Nur*_*hid 10

假设您的数据库名称是"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;
Run Code Online (Sandbox Code Playgroud)

输出:

    +---------+-----------+
    | Table   | Size (MB) |
    +---------+-----------+
    | news    |      0.08 |
    | keyword |      0.02 |
    +---------+-----------+
    2 rows in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

具体表格:

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;
Run Code Online (Sandbox Code Playgroud)

输出:

+-------+-----------+
| Table | Size (MB) |
+-------+-----------+
| news  |      0.08 |
+-------+-----------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)


小智 10

我发现现有的答案实际上并没有给出磁盘上表的大小,这更有帮助。与基于 data_length 和索引的表大小相比,此查询提供更准确的磁盘估计。我必须将其用于 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
Run Code Online (Sandbox Code Playgroud)

  • 这应该是答案,至少对于 INNODB 来说是这样。如果您有较大的行外数据字段(如 blob),仅将 DATA_LENGTH、INDEX_LENGTH 和 DATA_FREE 相加并不能获得磁盘上的大小。对于 INNODB,您确实需要使用 INNDB_SYS_TABLESPACES.FILE_SIZE 来*准确*读取磁盘大小,但您还需要 PROCESS 权限才能从此表中进行选择。 (2认同)

ken*_*orb 7

尝试以下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
Run Code Online (Sandbox Code Playgroud)


Alm*_*mis 6

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

例如

Space usage
Data    1.5 MiB
Index   0   B
Total   1.5 Mi
Run Code Online (Sandbox Code Playgroud)


小智 5

下面是使用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


dev*_*101 5

改编自 ChapMic 的答案,以满足我的特殊需求。

仅指定您的数据库名称,然后按降序对所有表进行排序 - 从所选数据库内最大的表到最小的表。只需要替换 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;
Run Code Online (Sandbox Code Playgroud)