OPTIMIZE [NO_WRITE_TO_BINLOG | LOCAL] TABLEtbl_name
[,tbl_name
] ...
もしテーブルの大部分を削除したり、変数長行で何箇所もテーブルを変更した場合は
(VARCHAR
、VARBINARY
、BLOB
、または
TEXT
カラムを持つテーブル)、OPTIMIZE
TABLE
を利用しなければいけません。削除された行はリンクされたリスト内で保存され、後続の
INSERT
操作は古い行の位置を再利用します。使用されていないスペースの再要求をし、データファイルをデフラグするには
OPTIMIZE TABLE
を利用することができます。
このステートメントはテーブルに
SELECT
と
INSERT
権限を要求します。
MySQL 5.1.27
からは、OPTIMIZE
TABLE
はパーティション化されたテーブルに対してもサポートされています。また、MySQL
5.1.27 からは、ALTER TABLE ...
OPTIMIZE PARTITION
を使用して 1
つ以上のパーティションを最適化することもできます。詳細については、項8.1.7. 「ALTER TABLE
構文」
および Maintenance of Partitions
を参照してください。
ほとんどの設定で、OPTIMIZE
TABLE
を利用する必要はまったくありません。可変長行の更新を頻繁にするとしても、特定のテーブルに対してだけ、この作業を週に一度、または月に一度以上する必要はありません。
OPTIMIZE TABLE
は、MyISAM
、InnoDB
、および
ARCHIVE
テーブルに対してのみ機能します。ほかの任意のストレージエンジンを使用して作成されたテーブル
(NDBCLUSTER
ディスクデータテーブルを含む)
に対しては機能しません。
MySQL Cluster NDB 6.3.7
からは、OPTIMIZE
TABLE
はインメモリー
NDBCLUSTER
テーブルの動的カラムに対してサポートされています。Cluster
テーブル上の OPTIMIZE
のパフォーマンスは、OPTIMIZE
TABLE
によって行のバッチの処理間で待機するミリ秒数を制御する
ndb_optimization_delay
システム変数の値を調整することによって調整できます。詳細については、Previous MySQL Cluster Issues Resolved in MySQL 5.1, MySQL Cluster NDB 6.x, and MySQL Cluster NDB 7.x
を参照してください。
MySQL Cluster NDB 6.3.8
からは、たとえば、OPTIMIZE
操作を実行している SQL
スレッドを強制終了することによって
OPTIMIZE TABLE
を中断できます。
MyISAM
テーブルに対しては、OPTIMIZE
TABLE
は次のように機能します。
もしテーブルが行を削除したり分割したりすると、テーブルを修復します。
もしインデックスページがソートされていなければ、それらをソートします。
もしテーブルの統計が最新でなければ、(そしてインデックスをソートすることで修復が完了されなければ) それらを更新します。
InnoDB
テーブルに対しては、インデックス統計とクラスタインデックス内の使用されていないフリースペースを更新するためにテーブルを復元する
ALTER TABLE
に
OPTIMIZE TABLE
がマップされます。MySQL 5.1.27
からは、次に示すように、これは
InnoDB
テーブル上で
OPTIMIZE 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 | +----------+----------+----------+-------------------------------------------------------------------+
--skip-new
か
--safe-mode
オプションを利用して
mysqld
をスタートさせることで、OPTIMIZE
TABLE
が別のストレージエンジン上で機能させることができます。この場合、OPTIMIZE
TABLE
は単に
ALTER TABLE
にマップされます。
OPTIMIZE TABLE
は、次のカラムを含む結果セットを返します。
カラム | 値 |
テーブル |
テーブル名 |
Op |
いつも optimize
|
Msg_type |
status 、error 、info 、または
warning
|
Msg_text |
情報メッセージ |
MySQL は OPTIMIZE
TABLE
が起動している最中にテーブルをロックするということに注意してください。
デフォルトでは、OPTIMIZE
TABLE
ステートメントはレプリケーションスレーブに複製されるように、バイナリログに書き込まれます。ロギングは、オプションの
NO_WRITE_TO_BINLOG
キーワードまたはそのエイリアス
LOCAL
を使用して抑制できます。
OPTIMIZE TABLE
は、POINT
カラム上の空間インデックスのような、R-tree
インデックスをソートしません。(Bug#23578)