与大多数关系数据库一样,MySQL 提供了有关数据库本身的有用元数据。虽然大多数其他数据库将此信息称为
catalog
, 但MySQL 官方文档INFORMATION_SCHEMA
将元数据 称为tables
。
目录
[1 列出单个数据库中的单表大小](#1 列出单个数据库中的单表大小)
[2 列出所有数据库中的所有表大小](#2 列出所有数据库中的所有表大小)
以下SQL语句的测试可以使用命令行,或是使用SQL工具比如MySQL Workbench或SQLynx等。
无论名称如何,重要的是这些 INFORMATION_SCHEMA
表提供的信息。从 到 的所有内容 views
都 user_privilieges
可以 columns
在 tables
中找到 INFORMATION_SCHEMA
。就我们的目的而言,我们特别感兴趣的是 tables
元数据,我们可以查询元数据以实际提取系统中各个表的大小。
1 列出单个数据库中的表大小
正如在 官方文档,该 INFORMATION_SCHEMA.TABLES
表包含大约 20 列,但为了确定表使用的磁盘空间量,我们将特别关注两列: DATA_LENGTH
和 INDEX_LENGTH
。
DATA_LENGTH
是表中所有数据的长度(或大小)(以 为单位bytes
)。INDEX_LENGTH
是表的索引文件的长度(或大小)(也以 为单位bytes
)。
有了这些信息,我们可以执行查询,列出特定数据库中的所有表以及每个表的磁盘空间(大小)。我们甚至可以更花哨一点,将正常大小值转换为 bytes
对大多数人更有用、更容易理解的值,例如 megabytes
。
sql
SELECT
TABLE_NAME AS `Table`,
ROUND((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024) AS `Size (MB)`
FROM
information_schema.TABLES
WHERE
TABLE_SCHEMA = "bookstore"
ORDER BY
(DATA_LENGTH + INDEX_LENGTH)
DESC;
在这个使用 bookstore
数据库的例子中,我们将和合并 DATA_LENGTH
为 INDEX_LENGTH
, bytes
然后将其除以 1024
两次 以转换为 kilobytes
和 megabytes
。我们的结果集将如下所示:
`+----------------------------------+-----------+
| Table | Size (MB) |
+----------------------------------+-----------+
| book | 267 |
| author | 39 |
| post | 27 |
| cache | 24 |
...`
如果您不关心数据库中的所有表,而只想要特定表的大小,则可以简单地添加 AND TABLE_NAME = "your_table_name"
到 WHERE
子句中。这里我们只需要有关 book
表的信息:
sql
SELECT
TABLE_NAME AS `Table`,
ROUND((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024) AS `Size (MB)`
FROM
information_schema.TABLES
WHERE
TABLE_SCHEMA = "bookstore"
AND
TABLE_NAME = "book"
ORDER BY
(DATA_LENGTH + INDEX_LENGTH)
DESC;
正如预期的那样,结果如下:
`+-------+-----------+
| Table | Size (MB) |
+-------+-----------+
| book | 267 |
+-------+-----------+
1 row `in` `set` (0.00 sec)`
2 列出所有数据库中的所有表大小
如果您遇到数据库大小不断增长但不知道哪个表是罪魁祸首的问题,查询 整个系统中所有数据库中 所有 表 的大小可能会很有用 。这可以通过以下查询轻松完成:
sql
SELECT
TABLE_SCHEMA AS `Database`,
TABLE_NAME AS `Table`,
ROUND((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024) AS `Size (MB)`
FROM
information_schema.TABLES
ORDER BY
(DATA_LENGTH + INDEX_LENGTH)
DESC;
这不仅会返回表的大小,还会返回与其关联的表名和父数据库。