「テーブルは最適化をサポートせず、代わりに再作成+分析を行う」とはどういう意味ですか?


97

私はMySQL 5.5に取り組んでおり、OPTIMIZE TABLEクエリを使用してインデックスの再構築を試みています。以下のエラーが発生します:

テーブルは最適化をサポートせず、代わりに再作成+分析を実行します

これは何を意味するのでしょうか?MySQLエンジンはインデックスの再構築を許可していませんか?MySQL 5.5エンジンレベルで、このメッセージの背後で何が行われていますか?

回答:


189

それは本当に情報メッセージです。

おそらく、あなたは上のOPTIMIZEをやっているのInnoDB(というよりも、InnoDBストレージエンジンを使用してテーブルをテーブルのMyISAMストレージエンジン)。

InnoDBはMyISAMのようにOPTIMIZEをサポートしていません。何か違うことをします。空のテーブルを作成し、既存のテーブルからすべての行をそのテーブルにコピーし、基本的に古いテーブルを削除して新しいテーブルの名前を変更し、ANALYZEを実行して統計を収集します。これは、InnoDBがOPTIMIZEを実行できる最も近いものです。

あなたが得るメッセージは基本的にMySQLサーバーであり、InnoDBストレージエンジンがMySQLサーバーに言ったことを繰り返します:

テーブルは最適化をサポートしていません InnoDBストレージエンジンは言っています...

「私(InnoDBストレージエンジン)は、友人(MyISAMストレージエンジン)のようにOPTIMIZE操作を実行しません。」

「代わりに再作成+分析を行う」とは、InnoDBストレージエンジンによると...

「私は、同等の結果が得られる別の一連の操作を実行することにしました。」


13
わかりました、あなたがしている別の方法を共有していただけませんか。
Vikrant More 2015

これはMySQLリファレンスマニュアルのどこかにあると思います。これは予想される動作であり、心配する必要はありません。(ただし、プロセスが完了するまでテーブルが「ロック」され、使用できなくなることを除きます。これは、HUGH JASSテーブルの場合には時間がかかることがあります。)参照:https ://dev.mysql.com/doc/refman/5.5/ ja / optimize-table.html「InnoDBの詳細」セクションを参照してください。
spencer7593 2015年

MySQL Workbenchを使用してテーブルの最適化を実行することもできます。詳細については、スキーマとテーブルインスペクターのドキュメントをご覧ください。「テーブルの最適化」オプションに注目してください。
フィリップオルソン2015年

1
データベースの世界で始めている人々のための優れた説明。ありがとうございました
tachomi

5
注意-ディスク容量が少ない場合は、非常に大きなテーブルを再作成しようとしてサーバーが不足する可能性があるため、これを使用しないでください。
ダニーステープル2016

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
このメソッドはインデックスとトリガーを保持しますか?
Joel Murphy、

1
はい、もちろん。それらすべて!試してから、phpMyAdminを使用して再度チェックすることができます
tquang

これは外部キーを再作成しません。
DanB

1

より適切なオプションは、新しいテーブルを作成して行を宛先テーブルにコピーし、実際のテーブルを削除して、新しく作成したテーブルの名前を変更することです。この方法は小さなテーブルに適しています。


3
あなたの答えに沿ってサンプルコードをまとめることをお勧めします。見てい私は良い答えを書くか、どのように
フリッツ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.