MySQLのインデックスを最適化するコマンド

information_schemaにはテーブルごとの行数やデータサイズが格納されています。

select table_name,table_rows from information_schema.tables where table_schema=database();

しかしInnoDBの場合、この値が実際とずれることがあります。

そんな時に最適化するには以下のコマンドになります。

optimize table

テーブル最適化 のコマンドになります。

処理の間はロックがかかるので注意が必要です。

実際の処理の中身としてはrecreateコマンドとanalyzeコマンドが実行されているようです。

optimize table hoge;
+---------------------------+----------+----------+-------------------------------------------------------------------+
| Table                     | Op       | Msg_type | Msg_text                                                          |
+---------------------------+----------+----------+-------------------------------------------------------------------+
| dbname.hoge | optimize | note     | Table does not support optimize, doing recreate + analyze instead |
| dbname.hoge | optimize | status   | OK                                                                |
+---------------------------+----------+----------+-------------------------------------------------------------------+
2 rows in set, 1 warning (0.75 sec)

analyze table

インデックス最適化 のコマンドになります。

InnoDBの場合、基本的には前回インデックスが更新が行われてから以下の条件で自動的にインデックスの最適化が行われます。

  • テーブル行数全体の 1/16 が更新される
  • 20億行以上更新される

ですので通常はこのコマンドを実行する必要はありません。

http://www.dollpaper.com/info/498.html

https://www.softel.co.jp/blogs/tech/archives/2178

http://nippondanji.blogspot.jp/2010/09/innodb.html