13.7.2.4 OPTIMIZE TABLE 语句

OPTIMIZE [NO_WRITE_TO_BINLOG | LOCAL]
    TABLE tbl_name [, tbl_name] ...

OPTIMIZE TABLE重新组织 table 数据和关联索引数据的物理存储,以减少存储空间并提高访问 table 时的 I/O 效率。对每个 table 所做的确切更改取决于该 table 使用的storage engine

在这种情况下,请根据 table 的类型使用OPTIMIZE TABLE

该语句要求 table 具有SELECTINSERT特权。

OPTIMIZE TABLE适用于InnoDBMyISAMARCHIVEtable。内存NDBtable 中的动态列也支持OPTIMIZE TABLE。它不适用于内存 table 中的固定宽度列,也不适用于磁盘数据 table。可以使用--ndb-optimization-delay调整OPTIMIZE在 NDB 群集 table 上的性能,该参数通过OPTIMIZE TABLE控制在处理一批行之间 await 的时间。有关更多信息,请参见NDB Cluster 8.0 中解决的以前的 NDB Cluster 问题

对于 NDB 群集 table,可以通过(例如)杀死执行OPTIMIZE操作的 SQL 线程来中断OPTIMIZE TABLE

默认情况下,OPTIMIZE TABLE不适用于使用任何其他存储引擎创建的 table,并返回指示缺少支持的结果。您可以通过使用--skip-new选项启动mysqld来使OPTIMIZE TABLE用于其他存储引擎。在这种情况下,OPTIMIZE TABLE仅 Map 到ALTER TABLE

该语句不适用于视图。

分区 table 支持OPTIMIZE TABLE。有关将此语句与分区 table 和 table 分区一起使用的信息,请参见第 22.3.4 节“分区维护”

默认情况下,服务器将OPTIMIZE TABLE语句写入二进制日志,以便它们复制到副本。要禁止记录日志,请指定可选的NO_WRITE_TO_BINLOG关键字或其别名LOCAL

OPTIMIZE TABLE 输出

OPTIMIZE TABLE返回具有下 table 所示列的结果集。

Column Value
Table table 名
Op 一律optimize
Msg_type statuserrorinfonotewarning
Msg_text 信息性消息

OPTIMIZE TABLEtable 捕获并引发将 table 统计信息从旧文件复制到新创建的文件时发生的任何错误。例如。如果.frm.MYD.MYI文件的所有者的用户 ID 与mysqld进程的用户 ID 不同,则OPTIMIZE TABLE会生成“无法更改文件所有权”错误,除非root用户启动了mysqld

InnoDB Details

对于InnoDBtable,OPTIMIZE TABLEMap 到ALTER TABLE ... FORCE,它将重建 table 以更新索引统计信息并释放聚集索引中的未使用空间。当在InnoDBtable 上运行OPTIMIZE TABLE时,它会显示在OPTIMIZE TABLE的输出中,如下所示:

mysql> OPTIMIZE TABLE foo;
+----------+----------+----------+-------------------------------------------------------------------+
| Table    | Op       | Msg_type | Msg_text                                                          |
+----------+----------+----------+-------------------------------------------------------------------+
| test.foo | optimize | note     | Table does not support optimize, doing recreate + analyze instead |
| test.foo | optimize | status   | OK                                                                |
+----------+----------+----------+-------------------------------------------------------------------+

OPTIMIZE TABLEonline DDL用于常规 table 和已分区的InnoDBtable,这减少了并发 DML 操作的停机时间。由OPTIMIZE TABLE触发并由ALTER TABLE ... FORCE进行隐藏的 table 重建已就位。排他 table 锁定仅在操作的准备阶段和提交阶段短暂进行。在准备阶段,将更新元数据并创建一个中间 table。在提交阶段,将提交 table 元数据更改。

OPTIMIZE TABLE在以下情况下使用 table 复制方法重建 table:

包含FULLTEXT索引的InnoDBtable 不支持OPTIMIZE TABLE使用online DDL。而是使用 table 复制方法。

InnoDB使用页面分配方法存储数据,并且不会像传统存储引擎(例如MyISAM)那样遭受碎片化的困扰。在考虑是否运行优化时,请考虑服务器将处理的事务的工作量:

MyISAM Details

对于MyISAM个 table,OPTIMIZE TABLE的工作方式如下:

Other Considerations

OPTIMIZE TABLE是针对常规和分区InnoDBtable 在线执行的。否则,在OPTIMIZE TABLE运行期间,MySQL 锁定桌子

OPTIMIZE TABLE不对 R 树索引进行排序,例如POINT列上的空间索引。错误 23578)

首页