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

157

我想知道我的MySQL数据库占用了多少空间,以便选择一个网络主机。

我发现命令SHOW TABLE STATUS LIKE 'table_name',当我执行此查询时,会得到类似以下内容的结果:

Name       | Rows | Avg. Row Length | Data_Length | Index Length
----------   ----   ---------------   -----------   ------------
table_name   400          55            362000        66560
  • 数字已经四舍五入。

那么,对于这个表,我是有362000字节还是400* 362000 = 144800000 字节的数据? 指标长度是什么意思? 谢谢!


你有362000 + 66560。Data_Length + Index Length - mandza
可能是如何获取MySQL数据库大小?的重复问题。 - Mohammad
这个页面将会给你精确的答案 http://www.rathishkumar.in/2017/12/how-to-find-database-and-table-size-in-mysql.html - Rathish Kumar B
10个回答

302

来自S. Prakash,发现于MySQL论坛:

SELECT table_schema "database name",
    sum( data_length + index_length ) / 1024 / 1024 "database size in MB",
    sum( data_free )/ 1024 / 1024 "free space in MB"
FROM information_schema.TABLES
GROUP BY table_schema; 

或者为了更方便地复制粘贴,将其放在一行中:

SELECT table_schema "database name", sum( data_length + index_length ) / 1024 / 1024 "database size in MB", sum( data_free )/ 1024 / 1024 "free space in MB" FROM information_schema.TABLES GROUP BY table_schema; 

7
"Free Space in MB"是什么意思?我有数百GB的可用空间,但报告显示少于1GB的可用空间。 - Barth
1
@Barth 根据文档,它的意思是"InnoDB表中的空闲空间(以字节为单位)"。不幸的是,这个含义并没有被解释清楚 :-\ - ckujau
15
“可用空间(Free space)”指的是如果你对表进行“优化(optimize)”或从头重建表,就可以回收这些空间。当数据库在磁盘上存储信息时,会将其分配到块中;删除记录通常会在已用块之间释放一个块,并且移动所有其他块以利用该空间非常昂贵,因此它被标记为“可用”。该空间可能稍后由数据库引擎本身使用,也可以通过OPTIMIZE TABLE foo(MyISAM)或InnoDB表的重新创建和分析来回收。 - razzed

98

您可以在Mysql客户端中运行以下命令来获取您的Mysql数据库的大小

SELECT  sum(round(((data_length + index_length) / 1024 / 1024 / 1024), 2))  as "Size in GB"
FROM information_schema.TABLES
WHERE table_schema = "<database_name>"

33
如果您使用phpMyAdmin,它可以告诉您这些信息。只需转到“数据库”(顶部菜单)并单击“启用统计信息”。您将看到类似于此的内容: phpMyAdmin截图 随着大小的增加,这可能会失去一些准确性,但对于您的目的而言,应该足够准确。

我目前正在使用000webhost。它有phpMyAdmin,但我找不到“启用统计信息”复选框。也许有一个查询吗? - marvin
1
@marvin 嗯,可能是 Web 主机安装了较旧版本的 phpMyAdmin。我不知道这个功能是在哪个版本中引入的。 - Radu Murzea
在您的侧边栏中,单击顶部的首页图标,即可进入主页。在右窗格中,单击“数据库”。它会显示一个列的数据库表,下方有一个名为“启用统计信息”的链接。 - Whip
我看到一个提示:在此启用数据库统计信息可能会导致Web服务器和MySQL服务器之间的大量流量。启用统计信息可能会影响应用程序的性能。我宁愿运行minhas23建议的查询。 - ryadavalli

11

如果您想在MB中找到它,请按照以下步骤操作

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; 

这个答案的SQL代码片段似乎是 https://dev59.com/7XI-5IYBdhLWcg3wq6Zo#1733523 的复制。 - Ariel Allon

4

嗯,这个页面是我提出问题的来源。但是根据这个查询,我有0.5 MB,这让我感到相当安全。希望这是真的 :) 谢谢! - marvin

3
如果您想查找所有MySQL数据库的大小,请使用此命令,它将显示它们各自以兆字节为单位的大小;
SELECT table_schema "database", sum(data_length + index_length)/1024/1024 "size in MB" FROM information_schema.TABLES GROUP BY table_schema;

如果你有大型数据库,你可以使用以下命令以GB为单位显示结果:
SELECT table_schema "database", sum(data_length + index_length)/1024/1024/1024 "size in GB" FROM information_schema.TABLES GROUP BY table_schema;

如果您想显示特定数据库(例如YOUR_DATABASE_NAME)的大小,可以使用以下查询:

SELECT table_schema "database", sum(data_length + index_length)/1024/1024/1024 "size in GB" FROM information_schema.TABLES WHERE table_schema='YOUR_DATABASE_NAME' GROUP BY table_schema;

0

所有答案都不包括表的开销大小和元数据大小。

以下是数据库分配的“磁盘空间”的更准确估计。

SELECT ROUND((SUM(data_length+index_length+data_free) + (COUNT(*) * 300 * 1024))/1048576+150, 2) AS MegaBytes FROM information_schema.TABLES WHERE table_schema = 'DATABASE-NAME'

5
请问是否需要您进一步阐述?特别是您提到的常数“300”和“150”是什么意思? - Melebius
请问,您能详细说明一下吗? - Allan Andrade

0

如果您正在使用MySql Workbench,获取数据库大小、每个表的大小、索引大小等所有细节非常容易。

  1. 右键单击模式
  2. 选择模式检查器选项

    enter image description here

  3. 它显示模式大小的所有细节

  4. 选择表格选项卡以查看每个表的大小。

    enter image description here

  5. 表格大小显示在数据长度列中


0

SUM(Data_free)可能有效,也可能无效。它取决于innodb_file_per_table的历史记录。更多讨论请参见这里


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接