对 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 几乎从不需要 ANALYZE
或 OPTIMIZE
;除非您确定需要,否则不要浪费您的时间。
一个例外是 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
,上述技术可能会出现问题。)
那时,当我大量使用 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 toALTER 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 几乎从不需要 ANALYZE
或 OPTIMIZE
;除非您确定需要,否则不要浪费您的时间。
一个例外是 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
,上述技术可能会出现问题。)