MySQL 对 InnoDB 表进行碎片整理

Posted

技术标签:

【中文标题】MySQL 对 InnoDB 表进行碎片整理【英文标题】:MySQL defragment InnoDB tables 【发布时间】:2014-10-22 18:02:38 【问题描述】:

运行mysqltuner后,我收到了这样的输出:

Total fragmented tables: 284

为了进行碎片整理,我尝试了这些:

1. ALTER TABLE tbl_name ENGINE=INNODB
2. Another way to perform a defragmentation operation is to use mysqldump to dump the table to a text file, drop the table, and reload it from the dump file.

MySQL documentation 中描述了这两种方法。

但是这些方法都没有帮助。 mysqltuner 还是说表是碎片化的。

注意: innodb_file_per_table 在我的配置中处于关闭状态。

如何对我的 InnoDB 表进行碎片整理?

【问题讨论】:

在您的任何桌子上运行OPTIMIZE TABLE 是否有帮助? 它返回“表不支持优化,而是重新创建+分析” 我认为 Mysqltuner 骗了你。 ALTER TABLE tbl_name ENGINE=INNODB 重建表,不能分片。您可以使用 Jeremy 的工具来探索 InnoDB 表空间并检查 fragmentatopn 级别blog.jcole.us/2013/01/03/a-quick-introduction-to-innodb-ruby 我用deciusac.com/linux-2/…这里的查询来查看优化后是否仍然碎片化,我的表格仍然是碎片化的 【参考方案1】:

ALTER TABLE tbl_name ENGINE=INNODB

是对 innodb 表进行碎片整理的唯一方法。

ALGORITHM=INPLACE 可以帮助我们在线完成。

【讨论】:

【参考方案2】:

从 MySQL 5.5.11 开始,您还可以使用 ALTER TABLE tbl_name FORCE 执行“空”更改操作,重建表。 以前 FORCE 选项被识别但被忽略了。

https://dev.mysql.com/doc/refman/5.5/en/alter-table.html

【讨论】:

【参考方案3】:

我遇到了同样的问题,对我有用的解决方案是在alter 之后执行analyze

alter table xyz engine=InnoDB;
analyze table xyz;

【讨论】:

以上是关于MySQL 对 InnoDB 表进行碎片整理的主要内容,如果未能解决你的问题,请参考以下文章

Mysql Innodb 表碎片整理

小白学习MySQL - 表空间碎片整理方法

小白学习MySQL - InnoDB支持optimize table?

技术分享 | MySQL 表空间碎片整理方法

mysql表碎片的查询自己回收

mysql碎片处理_mysql碎片整理