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

wnvonmuf  于 2022-11-28  发布在  Mysql
关注(0)|答案(5)|浏览(151)

我正在MySQL 5.5上工作,并尝试使用OPTIMIZE TABLE查询进行索引重建。我收到以下错误:
表不支持优化,改为执行重新创建+分析
这是什么意思?MySQL引擎不允许索引重建吗?在MySQL 5.5引擎级别,此消息背后是什么?

5fjcxozz

5fjcxozz1#

这确实是一条信息性消息。
很可能,您正在对InnoDB表(使用InnoDB存储引擎而不是MyISAM存储引擎的表)执行OPTIMIZE。
InnoDB不像MyISAM那样支持OPTIMIZE。它做了一些不同的事情。它创建一个空表,将现有表中的所有行复制到其中,实际上删除旧表并重命名新表,然后运行ANALYZE来收集统计信息。这是InnoDB所能做的最接近OPTIMIZE的事情。
您得到的消息基本上是MySQL服务器重复InnoDB存储引擎告诉MySQL服务器的内容:

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

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

**“执行重新创建+分析”**是InnoDB存储引擎的说法...

“我已决定执行一组 * 不同 * 的操作,这将获得相同的结果。”
编辑
这需要检查以确保准确性。从MySQL 5.7和MariaDB 10.3观察到的行为需要强调的一点是,InnoDB和MyISAM是两个不同的存储引擎。它们的操作方式不同。这就是为什么我们看到的消息不同。
我们向MySQL数据库服务器发出DDL语句。MySQL服务器接收该语句,执行通常的语法检查、解析、标记......并通过字典中的查找来解析对表和列的引用。

请注意-如果磁盘空间不足,请不要使用此选项,因为尝试重新创建非常大的表可能会导致服务器耗尽资源。--Danny Staple

是的,注意磁盘空间的限制。以及操作将在表上保持EXCLUSIVE(阻塞)锁多长时间。如果我们了解优化器将要进行的操作;通常,对于大量数据,我选择分区,这允许对可以交换到(REPLACE)现有分区中独立表进行操作。

7ajki6be

7ajki6be2#

根据官方支持文章,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                                                                |
+----------+----------+----------+-------------------------------------------------------------------+
y1aodyip

y1aodyip3#

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

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

重命名新的.NAME.TABLE和表.崩溃

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

工作做好后,删除

DROP TABLE <TABLE.CRASHED.BACKUP>;
r55awzrz

r55awzrz4#

我知道这是一个非常古老的主题/问题描述,但也许可以执行一个新的方法。
我在InnoDB引擎表中遇到了同样的问题。
正如“sdesvergez”所说的,optmize的工作原理是将返回的消息置为“否”。但是我们不知道在后台的真实的后果是什么。
我假设你的表不像我的(200 MB)那么大(小于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秒钟。
这样,您就不会在操作状态中收到任何奇怪的消息。
到目前为止,我还没有任何数据丢失或任何其他问题使用这种方法,但一个非常快速和有组织的表。

3qpi33ja

3qpi33ja5#

更好的选择是创建一个新表,将行复制到目标表,删除实际的表,然后重命名新创建的表。

相关问题