如何优化information_schema数据库中的表

4
我在我的information_Schema数据库中发现了免费空间(碎片化问题)。
警报显示一些表格(如COLUMNS,ROUTINES)中有1500%的可用空间。
我很担心这是怎么可能的,因为我在数据库中没有任何例程,我如何优化information_schema,因为它是基于内存的数据库,并在mysql服务启动时创建。
此外,当我查询任何information_schema表的“SHOW CREATE TABLE”时,它会给出这些表的innodb引擎,但我认为它应该是内存。
有没有什么方法可以在不重新启动的情况下优化这些表?
谢谢

首先请呈现一些具体信息。这可能是一个无关紧要的问题,或者是一个无法修复的问题。从那里开始,我们可以讨论可能的行动。例如,如果它只有1KB的1500%,我会认为这太小而不构成问题。但如果它是1GB,我们应该深入了解细节。 - Rick James
我正在寻找这个问题的原因。因为我从未在此实例上创建过例行程序,所以为什么会有任何可用的空间。 - Aman Aggarwal
InnoDB会预先分配空间以便于更多的插入/更新等操作,这是一种性能优化。您从information_schema获取的数字仅代表已存在的“自由”空间的一部分。没有办法摆脱这样的“浪费”空间。 - Rick James
你正在运行哪个版本的MySQL?这些表使用的是什么引擎? - Rick James
1个回答

0

当你设置 innodb_file_per_table = OFF 时,InnoDB 表会被创建在系统的“表空间”中,即 ibdata1。可能是因为你在那里创建和操作了很多表。

Data_free 是一个令人困惑的术语,在 SHOW CREATE TABLE 和某些 information_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个MyISAM的I_S表;没有InnoDB。你运行哪个版本?你看到了多少个? - Rick James
我的版本是MySQL 5.7。 - Aman Aggarwal
执行 use information_schema; show table status; 命令 -- 有多少个是 MyISAM 的表;有多少个是 InnoDB 的表? - Rick James

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