对 InnoDB 表进行分析和优化

Analyze + Optimize on InnoDB Tables

那时,当我大量使用 MyISAM 表时,我总是有一个 cronjob 运行

~# mysqlanalyze -o database

我知道 MyISAM 在某些方面从中受益,例如:碎片化等等

现在,当 运行 在大多数表是 InnoDB 的数据库上执行相同的命令时,我想知道这是否 "does any good" 到表并且被认为是一个很好的做法,现在和那么或者如果它适得其反。大量阅读:

Table does not support optimize, doing recreate + analyze instead

就磁盘 IO / CPU 时间而言,这听起来很昂贵?!

希望对此提供一些意见。

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

For InnoDB tables, OPTIMIZE TABLE is mapped to ALTER TABLE ... FORCE, which rebuilds the table to update index statistics and free unused space in the clustered index.

这在碎片太多的情况下确实有一些好处。如果您使用 innodb_file_per_table(这是最近版本的默认设置),页面将被更有效地填充,索引将被重建,并且 table 占用的磁盘 space 将减少。

这确实需要时间,具体取决于 table 的大小。它会在 运行ning 时锁定 table。它在 运行ning 时需要额外的磁盘 space,因为它会创建 table.

的副本

在 InnoDB table 上做优化 table 通常没有必要经常做,但只有在你对 table 做了很多 insert/update/delete 之后可能导致碎片化的方式。

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

的大小如何,它都不会更大

别打扰了。 InnoDB 几乎从不需要 ANALYZEOPTIMIZE;除非您确定需要,否则不要浪费您的时间。

一个例外是 InnoDB table 上的 FULLTEXT 索引。这样可以受益于DROP INDEX,然后ADD INDEX

如果您是 "reloading" 来自新数据的 table,则以下操作可避免停机:

CREATE TABLE new LIKE real;
load `new`
RENAME TABLE real TO old, new TO real;   -- fast, atomic
DROP TABLE old;

(警告:如果存在 FOREIGN KEYS,上述技术可能会出现问题。)