如何在 MySQL 中获取表数据占用空间


原文地址:如何在 MySQL 中获取表数据占用空间

本文分享了如何再Mysql中列出单个数据库中的表占用空间大小和列出所有数据库中的所有表占用空间大小。

像大多数关系数据库一样,MySQL 提供有关数据库本身的有用元数据。虽然大多数其他数据库将此信息称为 a catalog,但官方 MySQL 文档INFORMATION_SCHEMA元数据称为tables.

不管名称如何,重要的是这些INFORMATION_SCHEMA表提供的信息。一切从viewsuser_priviliegescolumnstables可以在找到INFORMATION_SCHEMA。出于我们的目的,我们对tables元数据特别感兴趣,我们可以查询它以实际提取系统中各种表的大小。

官方文档中可以看出,该INFORMATION_SCHEMA.TABLES表包含大约 20 列,但为了确定表使用的磁盘空间量,我们将特别关注两列:DATA_LENGTHINDEX_LENGTH

  • DATA_LENGTH是表中所有数据的长度(或大小)(in bytes)。
  • INDEX_LENGTH是表的索引文件的长度(或大小)(也在 中bytes)。

有了这些信息,我们就可以执行一个查询,该查询将列出特定数据库中的所有表以及每个表的磁盘空间(大小)。我们甚至可以更高级一点,将正常的大小值从bytes转换为对大多数人来说更有用和更容易理解的值megabytes

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_LENGTHbytes,然后将其除以1024 两次以转换为kilobytes,然后megabytes。我们的结果集将如下所示:

+----------------------------------+-----------+
| Table | Size (MB) |
+----------------------------------+-----------+
| book | 267 |
| author | 39 |
| post | 27 |
| cache | 24 |
...

如果您不关心数据库中的所有表而只想要特定表的大小,则可以简单地添加AND TABLE_NAME = "your_table_name"WHERE子句中。这里我们只需要关于book表的信息:

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)

如果您遇到数据库大小不断增长的问题,但您不知道哪个表是罪魁祸首,那么查询整个系统中所有数据库中所有表的大小可能会很有用。这可以通过以下查询轻松完成:

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;

这不仅会返回表的大小,还会返回与其关联的表名和父数据库。

SELECT
 TABLE_NAME AS `Table`,
 ROUND(INDEX_LENGTH/1024/1024) as `索引 MB`,
 ROUND(DATA_LENGTH / 1024 / 1024) AS `数据大小 (MB)`,
 ROUND((DATA_LENGTH+INDEX_LENGTH) / 1024 / 1024) AS `全部 (MB)`
FROM
 information_schema.TABLES
WHERE
 TABLE_SCHEMA = "数据库名称"
ORDER BY
 (DATA_LENGTH + INDEX_LENGTH)
DESC;

评论

登录后评论

服务器优惠活动

Top