如何优化information_Schema数据库中的表

Posted

技术标签:

【中文标题】如何优化information_Schema数据库中的表【英文标题】:How to optimize the tables in information_Schema database 【发布时间】:2016-11-11 15:57:16 【问题描述】:

我的 information_Schema 数据库中有可用空间(碎片问题)。

警报显示某些表(如 COLUMNS、ROUTINES)中有 1500% 的可用空间。

我担心这是怎么可能的,因为我的数据库中没有任何例程,以及我如何优化 information_schema,因为它是基于内存的数据库并在 mysql 服务启动时创建。

此外,当我在任何 information_schema 表上查询 "SHOW CREATE TABLE" 时,它会将 innodb 作为这些表的引擎,但我认为它应该是内存。

有什么想法可以在不重新启动的情况下优化这些表吗?

谢谢

【问题讨论】:

首先向我们展示一些细节。这可能不是问题,也可能是无法修复的问题。从那里,我们可以讨论可能的行动。例如,如果它是 1KB 的 1500%,我会认为它太小而不会成为问题。但如果是 1GB,我们应该深入研究细节。 我正在寻找原因。因为我从来没有在这个实例上创建过例程,所以为什么会有任何可用空间。 InnoDB 预分配空间以预期更多的插入/更新/等。这是性能优化。您从information_schema 获得的数字只是存在的“可用”空间的一部分。没有办法摆脱这种“浪费”的空间。 你运行的是什么版本的 MySQL?这些表是什么 ENGINE? 【参考方案1】:

当您拥有innodb_file_per_table = OFF 时,InnoDB 表将在系统“表空间”ibdata1 中创建。可能是您在那里创建和操作了很多表。

Data_freeSHOW CREATE TABLEinformation_schema 中的某些表格中是一个令人困惑的术语...

对于 MyISAM 表,它是可以从 .MYD 文件(但不是 .MYI 文件)中恢复的准确空间量。 对于 InnoDB,它意味着两件事之一... 如果您正在查看的表是用innodb_file_per_table = ON 创建的,那么Data_free一些 未使用的空间。通常,并非所有这些都可以通过任何方式恢复。 如果您正在查看的表是用innodb_file_per_table = OFF 创建的,那么Data_free 就是ibdata1 中的可用空间。该空闲空间将用于新插入和新表,从而减少Data_free。但是,ibdata1 的大小不能缩小,至少在不费力气的情况下不能缩小(转储所有内容、删除、重新加载)。

【讨论】:

在我的 5.6.12 副本中,我看到 10 个 I_S 表是 MyISAM;零是 InnoDB。你运行的是什么版本?你每个看到几个? 我的版本是mysql 5.7 Do use information_schema; show table status; -- MyISAM 有多少; InnoDB 有多少个?

以上是关于如何优化information_Schema数据库中的表的主要内容,如果未能解决你的问题,请参考以下文章

information_schema.optimizer_trace学习

十分钟了结MySQL information_schema

(转)十分钟了结MySQL information_schema

mysql数据库如何优化?谁能给出点具体的解决方案?

如何使用备份恢复 information_schema 数据库

information_schema系列七