【问题标题】:What does "Table does not support optimize, doing recreate + analyze instead" mean?“表不支持优化,而是重新创建+分析”是什么意思?
【发布时间】:2015-08-18 13:53:03
【问题描述】:

我正在使用 MySQL 5.5 并尝试使用 OPTIMIZE TABLE 查询进行索引重建。我收到以下错误:

表格不支持优化,改为重新创建+分析

这是什么意思? MySQL引擎不允许索引重建吗?在 MySQL 5.5 引擎级别,这条消息背后的内容是什么?

【问题讨论】:

    标签: mysql


    【解决方案1】:

    我知道这是一个非常古老的主题/问题描述,但也许可以执行一种新方法。

    InnoDB 引擎表也有同样的问题。 正如“sdesvergez”所说,optmize 作品尽管返回的消息另有说明。但我们不知道背后的真正后果是什么。

    我假设您的表不像我的 (200Mb) 那样太大(小于 1GB)。

    我对表结构进行了更改,而不是“纯” InnoDB,我将表设置为单个分区:

    CREATE TABLE IF NOT EXISTS <<schema>>.<<table name>>(
    <<your tabe definition>>
    ) PARTITION BY KEY(<<key from table, in my case I used "day">>)
    PARTITIONS 1;
    

    尽管该表仍在使用 InnoDB 引擎,但现在具有更深层次的分区结构。

    当你这样做时,你可以重建分区以优化它。 重建将释放分配给已删除记录的空间并优化表。在我的例子中,这个过程需要 10 秒。

    这样您就不会在操作状态中收到任何奇怪的消息。 到目前为止,我使用这种方法没有任何数据丢失或任何其他问题,而是一个非常快速且有条理的表格。

    【讨论】:

      【解决方案2】:

      最好的选择是创建具有相同属性的新表

      CREATE TABLE <NEW.NAME.TABLE> LIKE <TABLE.CRASHED>;
      INSERT INTO <NEW.NAME.TABLE> SELECT * FROM <TABLE.CRASHED>;
      

      重命名 NEW.NAME.TABLE 和 TABLE.CRASH

      RENAME TABLE <TABLE.CRASHED> TO <TABLE.CRASHED.BACKUP>;
      RENAME TABLE <NEW.NAME.TABLE> TO <TABLE.CRASHED>;
      

      做好后删除

      DROP TABLE <TABLE.CRASHED.BACKUP>;
      

      【讨论】:

      • 此方法是否保留索引和触发器?
      • 是的,当然。他们都是!您可以尝试一下,然后使用 phpMyAdmin 再次检查
      • 这不会重新创建外键。
      【解决方案3】:

      这确实是一条信息性消息。

      很可能,您正在对 InnoDB 表(使用 InnoDB 存储引擎而不是 MyISAM 存储引擎的表)进行 OPTIMIZE。

      InnoDB 不像 MyISAM 那样支持 OPTIMIZE。它做了一些不同的事情。它创建一个空表,并将现有表中的所有行复制到其中,实质上删除旧表并重命名新表,然后运行 ​​ANALYZE 以收集统计信息。这是 InnoDB 最接近 OPTIMIZE 的地方。

      您收到的消息基本上是 MySQL 服务器重复 InnoDB 存储引擎告诉 MySQL 服务器的内容:

      表不支持优化是InnoDB存储引擎的说法...

      “我(InnoDB 存储引擎)不像我的朋友(MyISAM 存储引擎)那样做 OPTIMIZE 操作。”

      “改为重新创建 + 分析” 是 InnoDB 存储引擎的说法...

      “我决定执行一组不同的操作,这将获得相同的结果。”

      【讨论】:

      • 好的,你能不能分享一下你正在做的不同方式。
      • 我确定这在 MySQL 参考手册中的某处;这是预期的行为,无需担心。 (除了表将被“锁定”并且在进程运行完成时不可用,这对于 HUGH JASS 表可能需要一段时间。)参考:https://dev.mysql.com/doc/refman/5.5/en/optimize-table.html 请参阅“InnoDB 详细信息”部分。
      • 您也可以使用 MySQL Workbench 来执行表优化。有关更多信息,请参阅Schema and Table Inspector documentation。注意“优化表”选项。
      • 对 db 世界中开始的人的出色解释。非常感谢
      • 当心 - 如果您的磁盘空间不足,请不要使用它,因为它可能会导致您的服务器在尝试重新创建非常大的表时用尽。
      【解决方案4】:

      更好的选择是创建一个新表,将行复制到目标表,删除实际表并重命名新创建的表。 这种方法适合小表,

      【讨论】:

      【解决方案5】:

      OPTIMIZE TABLE 根据官方支持文章:http://dev.mysql.com/doc/refman/5.5/en/optimize-table.html

      与 InnoDB 引擎配合得很好

      您会注意到优化 InnoDB 表将重建表结构并更新索引统计信息(类似于ALTER TABLE)。

      请记住,此消息可能只是信息性提及,非常重要的信息是您的查询状态:OK!

      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                                                                |
      +----------+----------+----------+-------------------------------------------------------------------+
      

      【讨论】:

      • 不是真的,MySQL会给出失败原因:临时文件写入失败,操作失败。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-29
      • 2015-01-22
      • 2019-10-18
      • 2014-03-08
      • 2012-08-10
      • 2020-04-04
      • 1970-01-01
      相关资源
      最近更新 更多