OPTIMIZE TABLE
是一个MySQL的SQL语句,它用于整理表中的数据,从而优化存储空间和提高数据访问效率。这个命令会对MyISAM、InnoDB和ARCHIVE存储引擎的表进行操作。
当你在数据库中频繁地进行INSERT、UPDATE或DELETE操作时,这些改动可能会导致数据分散存储于物理硬盘上(尤其是MyISAM存储引擎)。此外,在删除大量记录后,存储空间并不会立即释放回操作系统,而是被数据库保留以供将来使用。这样就会产生碎片,进而可能降低查询性能。
使用OPTIMIZE TABLE
可以执行以下操作:
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
?在对InnoDB表执行时实际上是一个重建表的过程,这可能是一个耗时的操作。OPTIMIZE TABLE
操作可以通过配置文件或者启动命令行参数来关闭自动的碎片整理。OPTIMIZE TABLE
之前,最好备份数据库,尤其是在生产环境中。在具有全文索引的表上运行 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
操作结束的位置继续。