如何优化和修复 InnoDB 表?ALTER 和 OPTIMIZE 表失败

THp*_*ubs 5 mysql innodb

我刚刚将我的 Wordpress 数据库切换为使用 InnoDB 引擎。

使用 MyISAM 时,我曾经运行OptimizeRepair table. 但是,对于 InnoDB,这些不起作用。

我手动运行OPTIMIZE TABLE并建议ALTER TABLE但没有一个删除开销。我在mysqltuner显示 14 个碎片表的服务器上运行- 我总共有 14 个表。即使在运行optimizeand 之后alter tables,所有 14 个表仍然碎片化!

我怎样才能正确地OPTIMIZEREPAIRInnoDB 表?

Rol*_*DBA 4

哎哟你已经关闭了 innodb_file_per_table

我之前写过这方面的文章。您必须转换 InnoDB 基础架构。

一旦你这样做了,任何时候你对 InnoDB 进行 OPTIMIZE TABLE 操作,它实际上都会收缩。

如果不执行 InnoDB 基础设施清理,ibdata1 文件的大小实际上会增加。更糟糕的是,我认为 mysqltuner.pl 使用了一种奇怪的算法来确定 InnoDB 碎片。我倾向于忽略它。

我以不同的方式检查碎片。

早在 2012 年 4 月 19 日,我就回答了一个类似的问题:How do youremovefragmentation from InnoDBtables?

这是我在之前的帖子中所说的:

运行上述步骤后,如何确定哪些表需要进行碎片整理?可以找到,但你需要编写脚本。

这是一个示例:假设您有表mydb.mytable. 启用 innodb_file_per_table 后,您将拥有文件 /var/lib/mysql/mydb/mytable.ibd

您将必须检索两个号码

操作系统中的文件大小:您可以像这样从操作系统中确定文件大小

ls -l /var/lib/mysql/mydb/mytable.ibd | awk '{print $5}'
Run Code Online (Sandbox Code Playgroud)

FILESIZE FROM INFORMATION_SCHEMA :您可以从 information_schema.tables 确定文件大小,如下所示:

SELECT (data_length+index_length) tblsize FROM information_schema.tables
WHERE table_schema='mydb' AND table_name='mytable';
Run Code Online (Sandbox Code Playgroud)

只需从操作系统值中减去 INFORMATION_SCHEMA 值,然后将差值除以 INFORMATION_SCHEMA 值即可。

从那里您可以决定有多少百分比认为有必要对该表进行碎片整理。换句话说,如果.ibd文件的文件大小与 INFORMATION_SCHEMA.TABLES 中的数字之间存在很大差异,请继续使用OPTIMIZE TABLE. 无论文件大小如何,如果碎片小于 1%,请不要担心。