使用 information_schema 查找 innodb 数据库的大小

using information_schema to find size of innodb databases

我们一台RDS服务器上大概有60-70个数据库,很多都可以删除。

我想做一个前后大小的benchmark,据我所知都是innoDB tables.

所以,我正在使用 information_schema table link:https://www.percona.com/blog/2008/03/17/researching-your-mysql-table-sizes/ 这很好,除了列出的第一个查询(我假设其他查询)只是 运行s 和 运行s 并最终在 8 分钟 .[= 后完成14=]

我可以立即运行这个查询:

SELECT COUNT(*) FROM information_schema.TABLES;

并获得大约 12,500 table秒。

我还注意到 - 具有讽刺意味的是 - information_schema.TABLES 没有索引!我的直觉是不要搞砸它。

此时我最好的选择是将表 table 和 运行 查询转储到我实际索引的副本上。

我的问题是: 1. information_schema.TABLES table 以及整个数据库的动态程度如何 2.为什么运行ning这么慢? 3. 索引一些关键字段来优化我想做的查询是否可取? 4. 如果我做一个 SQL 转储,我会得到当前的 table 大小信息吗?

谢谢,我希望这个问题有启发性。

information_schema 目前是一些旧内容之上的薄层。旧的东西需要 "open" 每个 table 来发现它的大小,等等。这涉及至少阅读 .frm。但它不需要打开来计算 table 的数量。想想 SHOW TABLESSHOW TABLE STATUS 之间的区别。

当您进行 8 分钟的查询时,

table_open_cachetable_definition_cache 可能确实包含所有 table。无论如何,那些 VARIABLES 的值可能小于 12,500,这意味着会有流失。

在未来(可能是 5.8),所有这些信息将 可能 位于单个 InnoDB table 而不是分散在 OS'文件系统。到那时,它会非常快。 (想想 table 扫描 12,500 行的速度有多快,特别是如果完全缓存在 RAM 中。)

由于information_schema没有"real"table,所以没办法加上INDEXes.

mysqldump 不提供 table 大小信息。即使这样做了,也不会更快,因为它会经过相同的旧机制。

60 是一个可疑的大量数据库; 12K 是大量的 table。通常这意味着模式设计选择创建多个 table 而不是将数据放入单个 table?