我可以运行此查询来获取MySQL数据库中所有表的大小:
我想要一些帮助来理解结果。我在找最大尺寸的桌子。
我应该看哪一列?
- 你说的尺寸是什么意思?行数?磁盘上的字节数?
- @在磁盘上标记"我想要大小"是正确的方法吗?#du-sh/mnt/mysql_data/openx/f_scraper_banner_details.myi 79g/mnt/mysql_data/openx/f_scraper_banner_details.myi
- 相关的,如果感兴趣的话,我写了一个描述这个答案中所有表格的描述。
您可以使用此查询显示表的大小(尽管您需要先替换变量):
1 2 3 4 5 6
| 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"; |
或者这个查询列出每个数据库中每个表的大小,最大的第一个:
1 2 3 4 5 6
| 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; |
- 谢谢,它工作得很好,不过我不确定它是否考虑了斑点。
- 注意,还可以使用"in"指定多个表,例如AND table_name IN ('table_1', 'table_2', 'table_3');。
- afaict,这只会正确计算静态大小字段的长度。您如何计算VARCHAR和BLOB类型?
- 嗨,我注意到这个查询生成的数字(至少是最上面的那个)并不总是反映我在表中所做的更改;也就是说,我添加了行,更改后数字保持不变。有没有一种方法可以可靠地让这个数字根据表的当前大小进行更新?
- 你将SUM除以1024两次,从字节到千字节再到兆字节。这假设一个千字节包含1024个字节,但是Mac OS使用"十进制"系统,即1千字节=1000个字节(en.wikipedia.org/wiki/kilobyte)。因此,这些系统上的SUM不应该被1000除以两次,还是mysql会以某种方式补偿/忽略这一点?
- 如果你为其他人写了一个插件,却不知道他们的数据库名$db_-name怎么办?我可以通过SELECT DATABASE()获得数据库名称,但不知道如何将其与上面的查询结合起来。
- @echtenfachtv用(SELECT DATABASE())代替"$DB_NAME"。
- @Kasimir在某种程度上让世界感到困惑,一些标准组织和硬件制造商认为在十进制系统中定义一个千字节更好。国际电工委员会标准现在称2千字节(1024字节)为kibibyte(kib)。无论如何,MySQL都不知道,所以如果你想要IEC十进制千字节,就除以1000。
- 当无法访问信息时,如何使其成为数据库模式?
- @德鲁达维,你需要运行OPTIMIZE TABLE tablename。然后你就可以得到一个可靠的数字。
- 这对InnoDB存储引擎有效吗?根据mysql-doc here-dev.mysql.com/doc/refman/5.7/en/show-table-status.html,该引擎的数据长度字段包含聚集索引的大小。这不能正确地表示数据的大小。会吗?
- 对争端裁决委员会有限制的可选WHERE条款:where table_schema='mydatabase'。
- 哈哈,我先把"表名"改成我的表名
- 回答太好了,省去了我的麻烦!我以前在控制台上查看过文件大小,但是在迁移到RDS之后,这不再是一个选项了。
1 2 3 4 5 6 7
| 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 |
您可以从"Information_Schema"->Schemata Table->"Schema_Name"列获取架构名称。
附加的您可以按如下方式获取MySQL数据库的大小。
1 2 3 4
| 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 ; |
结果
1 2 3 4
| DB Name | DB Size in MB
mydatabase_wrdp 39.1
information_schema 0.0 |
您可以在这里获得更多详细信息。
这将对大小(db大小(MB))进行排序。
如果希望查询使用当前选定的数据库。只需复制粘贴此查询。(无需修改)
- 或者更短(不带子查询):从信息表中选择表名、圆((数据长度+索引长度)/1024/1024),2)SIZE_MB,其中表_schema=database()按(数据长度+索引长度)asc排序;
使用工作台可以很容易地获得许多信息:
- 我的Mac客户端v 6.0.9没有"信息"选项卡
- 伟大的!!!!在MySQLWorkbench中,每个表都有一个"表检查器"。不是很快,但很方便!
假设您的数据库名是"新闻警报"。然后这个查询将显示数据库中所有表的大小。
所有表的大小:
输出:
1 2 3 4 5 6 7
| +---------+-----------+
| Table | Size (MB ) |
+---------+-----------+
| news | 0.08 |
| keyword | 0.02 |
+---------+-----------+
2 rows in set (0.00 sec ) |
对于特定表:
1 2 3 4 5 6 7 8 9 10 11 12
| 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; |
输出:
1 2 3 4 5 6
| +-------+-----------+
| Table | Size (MB ) |
+-------+-----------+
| news | 0.08 |
+-------+-----------+
1 row in set (0.00 sec ) |
尝试以下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解决方案,请检查以下示例脚本,该脚本将显示正在使用的最大表:
1 2 3 4 5
| #!/bin/sh
DB_NAME =$ (drush status --fields=db -name --field -labels =0 | tr -d '
')
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 |
如果您使用phpmyadmin,那么只需转到表结构
例如
下面是使用bash命令行解决这个问题的另一种方法。
for i in mysql -NB -e 'show databases';do echo$i;mysql-e"选择表名为‘表’,取整((数据长度+索引长度)/1024/1024),2)‘大小(MB)’,来自信息schema.tables,其中表schema="$i"order by(数据长度+索引长度)desc";done< /代码>
根据Chapmic的回答改编,以满足我的特殊需求。
仅指定数据库名称,然后按降序对所有表进行排序-从所选数据库中的最大表到最小表。只需要替换一个变量=您的数据库名称。
显示所占行数和空间并按其排序的另一种方法。
1 2 3 4 5 6 7 8
| SELECT
table_schema as `Database`,
table_name AS `Table`,
table_rows AS"Quant of Rows",
round(((data_length + index_length ) / 1024 / 1024/ 1024), 2) `Size in GB`
FROM information_schema. TABLES
WHERE table_schema = 'yourDatabaseName'
ORDER BY (data_length + index_length ) DESC; |
在这个查询中,唯一需要替换的字符串是"yourdatabasename"。
我发现现有的答案实际上没有给出磁盘上表的大小,这更有用。与基于数据长度的表大小相比,此查询提供更准确的磁盘估计索引。我不得不将它用于一个AWS RDS实例,在这个实例中,您无法实际检查磁盘和检查文件大小。
1 2 3 4 5 6
| 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 |
如果您有ssh访问权,您可能只想尝试du -hc /var/lib/mysql(或不同的datadir,如您的my.cnf中设置的那样)。
计算结尾处数据库的总大小:
这应该在MySQL中测试,而不是PostgreSQL
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;
- 虽然这可能会回答作者的问题,但它缺少一些解释性的词语和/或文档链接。如果没有周围的一些短语,原始代码片段就不是很有用。你也会发现如何写一个好的答案非常有帮助。请编辑您的答案-从评论中
- @尼克为什么还被禁止?
- 对不起,我不知道答案-我不是主持人。
16
以上2个都是在mysql上测试的