【发布时间】:2015-08-18 13:53:03
【问题描述】:
我正在使用 MySQL 5.5 并尝试使用 OPTIMIZE TABLE 查询进行索引重建。我收到以下错误:
表格不支持优化,改为重新创建+分析
这是什么意思? MySQL引擎不允许索引重建吗?在 MySQL 5.5 引擎级别,这条消息背后的内容是什么?
【问题讨论】:
标签: mysql
我正在使用 MySQL 5.5 并尝试使用 OPTIMIZE TABLE 查询进行索引重建。我收到以下错误:
表格不支持优化,改为重新创建+分析
这是什么意思? MySQL引擎不允许索引重建吗?在 MySQL 5.5 引擎级别,这条消息背后的内容是什么?
【问题讨论】:
标签: mysql
我知道这是一个非常古老的主题/问题描述,但也许可以执行一种新方法。
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 秒。
这样您就不会在操作状态中收到任何奇怪的消息。 到目前为止,我使用这种方法没有任何数据丢失或任何其他问题,而是一个非常快速且有条理的表格。
【讨论】:
最好的选择是创建具有相同属性的新表
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>;
【讨论】:
这确实是一条信息性消息。
很可能,您正在对 InnoDB 表(使用 InnoDB 存储引擎而不是 MyISAM 存储引擎的表)进行 OPTIMIZE。
InnoDB 不像 MyISAM 那样支持 OPTIMIZE。它做了一些不同的事情。它创建一个空表,并将现有表中的所有行复制到其中,实质上删除旧表并重命名新表,然后运行 ANALYZE 以收集统计信息。这是 InnoDB 最接近 OPTIMIZE 的地方。
您收到的消息基本上是 MySQL 服务器重复 InnoDB 存储引擎告诉 MySQL 服务器的内容:
表不支持优化是InnoDB存储引擎的说法...
“我(InnoDB 存储引擎)不像我的朋友(MyISAM 存储引擎)那样做 OPTIMIZE 操作。”
“改为重新创建 + 分析” 是 InnoDB 存储引擎的说法...
“我决定执行一组不同的操作,这将获得相同的结果。”
【讨论】:
更好的选择是创建一个新表,将行复制到目标表,删除实际表并重命名新创建的表。 这种方法适合小表,
【讨论】:
OPTIMIZE TABLE 根据官方支持文章:http://dev.mysql.com/doc/refman/5.5/en/optimize-table.html
您会注意到优化 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 |
+----------+----------+----------+-------------------------------------------------------------------+
【讨论】: