回答:
@MitchWheatの回答を拡張するには(最初に直接回答する場合は+1):
ANALYZE TABLEはキーの分布を調べ、 INFORMATION_SCHEMA.STATISTICSに保存します。
OPTIMIZE TABLEは、テーブルを圧縮した後、 ANALYZE TABLEを実行します。OPTIMIZE TABLE mydb.mytable;
テーブルがMyISAMである場合に相当するものは次のとおりです。
ALTER TABLE mydb.mytable ENGINE=MyISAM;
ANALYZE TABLE mydb.mytable;
datadirのMyISAMテーブルmydb.mytableに/var/lib/mysql
は、次のファイルがあります。
/var/lib/mysql/mydb/mytable.frm
/var/lib/mysql/mydb/mytable.MYD
(データ)/var/lib/mysql/mydb/mytable.MYI
(インデックス)OPTIMIZE TABLE mydb.mytable
テーブルの.MYD
と.MYI
ファイルを縮小します。
これはInnoDBの場合と同じではありません。違いは次のとおりです。
各テーブルのデータとインデックスは、外部テーブルスペースファイルに保存されます。以下のためにdatadir
IS /var/lib/mysql
とテーブルmydb.mytable
次のように、それが格納されます。
/var/lib/mysql/mydb/mytable.frm
/var/lib/mysql/mydb/mytable.ibd
ときにOPTIMIZE TABLE mydb.mytable
実行され、mytable.ibd
縮小します。
/var/lib/mysql/mydb/mytable.frm
存在するだけです。テーブルのすべてのデータおよびインデックスページmydb.mytable
は、システムテーブルスペースファイルに保存されます/var/lib/mysql/ibdata1
。
ときにOPTIMIZE TABLE mydb.mytable
実行され、データとインデックスページは、ibdata1とに連続して書かれています。残念ながら、これによりibdata1は飛躍的に成長します。
Percona CTOのVadim Tkachenkoによる図解をご覧ください
あなたのコメントは
innodbの最適化テーブルはサポートされていないと思います。メッセージを受け取りました。インデックスが再作成されます。どのように機能しますか?
これを試してみた
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.5.29 MySQL Community Server (GPL)
Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> use test
Database changed
mysql> create table dat (a int, primary key (a));
Query OK, 0 rows affected (0.08 sec)
mysql> insert into dat values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
Query OK, 10 rows affected (0.04 sec)
Records: 10 Duplicates: 0 Warnings: 0
mysql> analyze table dat;
+----------+---------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+----------+---------+----------+----------+
| test.dat | analyze | status | OK |
+----------+---------+----------+----------+
1 row in set (0.06 sec)
mysql> optimize table dat;
+----------+----------+----------+-------------------------------------------------------------------+
| Table | Op | Msg_type | Msg_text |
+----------+----------+----------+-------------------------------------------------------------------+
| test.dat | optimize | note | Table does not support optimize, doing recreate + analyze instead |
| test.dat | optimize | status | OK |
+----------+----------+----------+-------------------------------------------------------------------+
2 rows in set (0.14 sec)
mysql>
あなたは正しいです。OPTIMIZE TABLE
単一の操作として実行することはできません。InnoDBが代わりに行うことは次のとおりです。
ALTER TABLE mydb.mytable ENGINE=InnoDB;
ANALYZE TABLE mydb.mytable;
これらの手順を自分で実行することもできます。
ただし、正直なところ、ANALYZE TABLE
クエリが実行されるたびにInnoDBストレージエンジンはインデックス内のページの通過に基づいてテーブルのカーディナリティの推定を実行するため、InnoDBテーブルに対して実行する必要はありません。数が多いがある場合はINSERTs
、UPDATEs
とDELETEs
、あなたがする必要がありますANALYZE TABLE
。高い数がある場合DELETEs
、次にALTER TABLE mydb.mytable ENGINE=InnoDB;
テーブルを縮小するために必要とされます。
私は実際にANALYZE TABLE
、特定のインスタンスでのInnoDB の無益さに関する投稿を書きました。
Oct 16, 2011
:サイトがダウンしないように、インデックスを突然再構築する必要がありますJun 21, 2011
:MySQL Query Optimizerはどこからインデックス統計を読み取りますか?OPTIMIZE TABLE
。あなたがするとOPTIMIZE TABLE
のInnoDBテーブルのために、MySQLが実行されるALTER TABLE ... ENGINE=InnoDB
とANALYZE TABLE ...
、あなたのための操作をそれが言うとき、「再作成が+の代わりにテーブルを分析すること。」
OPTIMIZE TABLE dat;
MySQL 5.5.29で走りましたが、すぐに文句を言いましたTable does not support optimize, doing recreate + analyze instead
。それが私がお勧めする理由ですALTER TABLE dat ENGINE=InnoDB; ANALYZE TABLE dat;
。
OPTIMIZE TABLE
InnoDBの上、サーバーは実際に、実際に実行しないALTER TABLE ... ENGINE=InnoDB
と、ANALYZE TABLE
舞台裏でその応答を返す前に...あなたが実際に実行できるようにOPTIMIZE TABLE
InnoDBテーブルの上に、そして意図した効果を実現します。