如何获取MySQL中表的大小?(官方校正版)

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

目录

[1 列出单个数据库中的单表大小](#1 列出单个数据库中的单表大小)

[2 列出所有数据库中的所有表大小](#2 列出所有数据库中的所有表大小)


以下SQL语句的测试可以使用命令行,或是使用SQL工具比如MySQL Workbench或SQLynx等。

无论名称如何,重要的是这些 INFORMATION_SCHEMA 表提供的信息。从 到 的所有内容 viewsuser_privilieges 可以 columnstables 中找到 INFORMATION_SCHEMA。就我们的目的而言,我们特别感兴趣的是 tables 元数据,我们可以查询元数据以实际提取系统中各个表的大小。

1 列出单个数据库中的表大小


正如在 官方文档,该 INFORMATION_SCHEMA.TABLES 表包含大约 20 列,但为了确定表使用的磁盘空间量,我们将特别关注两列: DATA_LENGTHINDEX_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_LENGTHINDEX_LENGTHbytes然后将其除以 1024 两次 以转换为 kilobytesmegabytes。我们的结果集将如下所示:

复制代码
`+----------------------------------+-----------+
| 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;

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

相关推荐
2301_77355362几秒前
mysql执行SQL查询时结果不一致_检查事务隔离级别设置与幻读
jvm·数据库·python
m0_377618232 分钟前
mysql如何解决乱码问题_检查客户端与服务器字符集一致性
jvm·数据库·python
m0_747854523 分钟前
html怎么转astro island模式_Astro Islands如何隔离HTML组件
jvm·数据库·python
m0_748920367 分钟前
如何利用SQL触发器自动记录数据修改_编写审计日志逻辑
jvm·数据库·python
tycooncool11 分钟前
Spring Boot中集成MyBatis操作数据库详细教程
数据库·spring boot·mybatis
2401_8371638912 分钟前
golang如何编写SSL证书到期检测工具_golang SSL证书到期检测工具编写总结
jvm·数据库·python
m0_6742946416 分钟前
CSS如何实现左图右文布局_利用float属性与清除浮动
jvm·数据库·python
weixin_4249993617 分钟前
Bootstrap制作后台管理系统布局 Bootstrap如何搭建Dashboard框架
jvm·数据库·python
baidu_3409988218 分钟前
mysql表名大小写敏感问题如何处理_Lower Case Table Names设置
jvm·数据库·python
m0_6742946418 分钟前
TensorFlow如何监控内存使用情况_结合tf.summary记录关键指标信息
jvm·数据库·python