OPTIMIZE TABLE 是一个MySQL的SQL语句,它用于整理表中的数据,从而优化存储空间和提高数据访问效率。这个命令会对MyISAM、InnoDB和ARCHIVE存储引擎的表进行操作。
当你在数据库中频繁地进行INSERT、UPDATE或DELETE操作时,这些改动可能会导致数据分散存储于物理硬盘上(尤其是MyISAM存储引擎)。此外,在删除大量记录后,存储空间并不会立即释放回操作系统,而是被数据库保留以供将来使用。这样就会产生碎片,进而可能降低查询性能。
使用OPTIMIZE TABLE可以执行以下操作:
下面是OPTIMIZE TABLE基本语法的例子:
OPTIMIZE TABLE table_name;
其中table_name是要优化的表名。
如果你想一次性优化多个表,可以列出所有表名,用逗号分隔:
OPTIMIZE TABLE table_name1, table_name2, ...;
假设我们有一个名为orders的表,经过长时间的使用之后我们想要优化它,我们可以这样做:
OPTIMIZE TABLE orders;
当执行OPTIMIZE TABLE时,MySQL会锁定该表,因此在操作期间表无法提供服务。因此,在使用此命令时应考虑影响,并尽可能地在负载较低的时段进行。
在具有全文索引的表上运行 OPTIMIZE TABLE 会重新生成全文索引,删除已删除的文档 ID 并在可能的情况下合并同一单词的多个条目。
要优化全文索引,请启用 innodb_optimize_fulltext_only 并运行 OPTIMIZE TABLE 。
mysql> set GLOBAL innodb_optimize_fulltext_only=ON; Query OK, 0 rows affected (0.01 sec) mysql> OPTIMIZE TABLE opening_lines; +--------------------+----------+----------+----------+ | Table | Op | Msg_type | Msg_text | +--------------------+----------+----------+----------+ | test.opening_lines | optimize | status | OK | +--------------------+----------+----------+----------+ 1 row in set (0.01 sec)
为了避免大型表上的全文索引的冗长重新生成时间,可以使用该 innodb_ft_num_word_optimize 选项分阶段执行优化。该 innodb_ft_num_word_optimize 选项定义每次 OPTIMIZE TABLE 运行时优化的字数。默认设置为 2000,这意味着每次 OPTIMIZE TABLE 运行时都会优化 2000 个单词。后续 OPTIMIZE TABLE 操作从上一个 OPTIMIZE TABLE 操作结束的位置继续。