那时,当我与MyISAM Tables一起工作时,我总是有一个运行的cronjob
~# mysqlanalyze -o database
我知道MyISAM可以通过某些方式从中受益,例如:碎片化和其他方式
现在,当在大多数表为InnoDB的数据库上运行相同命令时,我想知道这是否对表“有好处”,并且被认为是不时地这样做的一种好习惯,或者是否是相当好的做法富有成效的。大量阅读:
Table does not support optimize, doing recreate + analyze instead
关于磁盘IO / CPU时间,这听起来很昂贵?!
对此表示感谢。
答案 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=linear
或ANALYZE
。除非您确定需要,否则不要浪费时间。