分析和优化InnoDB表

时间:2019-02-24 08:58:56

标签: mysql innodb

那时,当我与MyISAM Tables一起工作时,我总是有一个运行的cronjob

~# mysqlanalyze -o database

我知道MyISAM可以通过某些方式从中受益,例如:碎片化和其他方式

现在,当在大多数表为InnoDB的数据库上运行相同命令时,我想知道这是否对表“有好处”,并且被认为是不时地这样做的一种好习惯,或者是否是相当好的做法富有成效的。大量阅读:

Table does not support optimize, doing recreate + analyze instead

关于磁盘IO / CPU时间,这听起来很昂贵?!

对此表示感谢。

2 个答案:

答案 0 :(得分:1)

https://dev.mysql.com/doc/refman/8.0/en/optimize-table.html说:

  

对于InnoDB表,OPTIMIZE TABLE被映射到ALTER TABLE ... FORCE,后者将重建表以更新索引统计信息并释放聚集索引中的未使用空间。

在碎片过多的情况下,这样做确实很有用。如果您使用innodb_file_per_table(这是最新版本中的默认设置),则将更有效地填充页面,重建索引,并减少表占用的磁盘空间。

这确实需要时间,具体取决于表的大小。它会在运行时锁定表。创建表的副本时,它将在运行时需要额外的磁盘空间。

通常不需要经常在InnoDB表上执行优化表,而只是在对表进行了大量的插入/更新/删除操作之后才可能导致碎片。

ANALYZE TABLE对InnoDB的影响要小得多。这不需要构建表的副本。这是一个只读操作,它只是从表中读取页面的随机样本,并使用该样本来估计行数,平均行大小,并更新有关索引的统计信息,以指导查询优化器。可以随时运行,它会暂时锁定该表,但是无论表的大小如何,该锁都不会更大。

答案 1 :(得分:0)

不要打扰。 InnoDB几乎从不需要activation_fn=linearANALYZE。除非您确定需要,否则不要浪费时间。