“表不支持优化,而是执行重新创建+分析”是什么意思?


97

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

表不支持优化,而是执行重新创建+分析

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

Answers:


189

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

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

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

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

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

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

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

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


13
好的,能否请您分享一下您的做法。
2015年

我确定这在MySQL参考手册的某个地方;这是预期的行为,无需关注。(除了表将被“锁定”并且在过程运行完成时不可用之外,对于HUGH JASS表可能要花一些时间。)参考:https : //dev.mysql.com/doc/refman/5.5/ cn / optimize-table.html请参阅“ InnoDB详细信息”部分。
spencer7593 2015年

您还可以使用MySQL Workbench执行表优化。有关其他信息,请参见Schema和Table Inspector文档。注意“优化表”选项。
菲利普·奥尔森

1
对于在数据库世界中启动的人们的出色解释。非常感谢
tachomi

5
当心-如果磁盘空间不足,请不要使用此选项,因为它可能会导致服务器用尽试图重新创建非常大的表的机会。
丹尼·史泰普

22

OPTIMIZE TABLE根据官方支持文章,InnoDB引擎可以很好地工作:http : //dev.mysql.com/doc/refman/5.5/en/optimize-table.html

您会注意到,优化InnoDB表将重建表结构并更新索引统计信息(如ALTER 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                                                                |
+----------+----------+----------+-------------------------------------------------------------------+

2
并非如此,MySQL会给出失败原因:临时文件写入失败,操作失败。
iwind

9

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

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

1
此方法是否保留索引和触发器?
乔尔·墨菲

1
当然是。他们全部!您可以尝试使用phpMyAdmin再次进行检查
tquang

这不会重新创建外键。
DanB

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.