OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLEtbl_name
[,tbl_name
] ...
もしテーブルの大部分を削除したり、変数長行で何箇所もテーブルを変更した場合は(VARCHAR
、VARBINARY
、BLOB
、または
TEXT
カラムを持つテーブル)、OPTIMIZE
TABLE
を利用しなければいけません。
削除された行はリンクされたリスト内で保存され、後続の
INSERT
操作は古い行の位置を再利用します。使用されていないスペースの再要求をし、データ
ファイルをデフラグするには OPTIMIZE
TABLE
を利用する事ができます。
このステートメントはテーブルに
SELECT
と INSERT
権限を要求します。
ほとんどの設定で、OPTIMIZE TABLE
を利用する必要は全くありません。可変長行の更新を頻繁にするとしても、特定のテーブルに対してだけ、この作業を週に一度、または月に一度以上する必要はありません。
OPTIMIZE TABLE
は
MyISAM
と InnoDB
テーブルに対して のみ
機能します。これは、NDB
ディスク データ
テーブルを含むその他のストレージ
エンジンを利用して作成されたテーブルには機能
しません。
MyISAM
テーブルに対しては、OPTIMIZE
TABLE
は次のように機能します。
もしテーブルが行を削除したり分割したりすると、テーブルを修復します。
もしインデックス ページがソートされていなければ、それらをソートします。
もしテーブルの統計が最新でなければ、(そしてインデックスをソートする事で修復が完了されなければ)それらを更新します。
InnoDB
テーブルに対しては、
インデックス統計とクラスタされたインデックス内の使用されていないフリー
スペースを更新する為にテーブルを復元する
ALTER TABLE
に OPTIMIZE
TABLE
がマップされます。
--skip-new
か --safe-mode
オプションを利用して mysqld
をスタートさせる事で、OPTIMIZE
TABLE
が別のストレージ
エンジン上で機能させる事ができます。この場合、OPTIMIZE
TABLE
は単に ALTER TABLE
にマップされます。
OPTIMIZE TABLE
は次のカラムを利用して結果セットを返します。
カラム | 値 |
Table |
テーブル名 |
Op |
いつも optimize
|
Msg_type |
status 、error 、info 、または
warning の1つ |
Msg_text |
メッセージ |
MySQL は OPTIMIZE TABLE
が起動している最中にテーブルをロックするという事に注意してください。
OPTIMIZE TABLE
ステートメントは、任意の
NO_WRITE_TO_BINLOG
キーワード(またはそのエイリアス
LOCAL
)が利用されない限り、バイナリ
ログに書きこまれます。これは、複製マスタとして機能している
MySQL サーバ上で利用される OPTIMIZE
TABLE
ステートメントが、複製スレーブにデフォルトで複製される為に行われます。
OPTIMIZE TABLE
は、POINT
カラム上の空間インデックスのような、R-tree
インデックスをソートしません。(バグ #23578)