Mysqlのテーブルの最適化とテーブルの分析の違いは何ですか?私はオンラインドキュメントを読みましたが、何が違うのかわかりません。
@ MitchWheatの回答 (最初に直接回答する場合は+1)を展開するには:
ANALYZE TABLE はキーの分布を調べ、 INFORMATION_SCHEMA.STATISTICS 。
OPTIMIZE TABLE は ANALYZEを実行しますTABLE テーブル圧縮を行った後。テーブルがMyISAMであった場合のOPTIMIZE TABLE mydb.mytable;
と同等のものは次のとおりです。
ALTER TABLE mydb.mytable ENGINE=MyISAM;
ANALYZE TABLE mydb.mytable;
Datadir /var/lib/mysql
のMyISAMテーブルmydb.mytableの場合、次のファイルがあります。
/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
が/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;
これらの手順を自分で実行することもできます。
ただし、正直なところ、InnoDBテーブルに対してANALYZE TABLE
を実行する必要はありません。これは、クエリが実行されるたびに、InnoDBストレージエンジンがインデックス内のページのパススルーに基づいてテーブルのカーディナリティを推定するためです。 INSERTs
、UPDATEs
、およびDELETEs
の数が多い場合は、ANALYZE TABLE
が必要です。 DELETEs
の数が多い場合、テーブルを圧縮するためにALTER TABLE mydb.mytable ENGINE=InnoDB;
が必要です。
実際に、特定の場合にInnoDBでANALYZE TABLE
の無益性について投稿しました。
Oct 16, 2011
: サイトが停止しないように、突然インデックスを再構築する必要がありますJun 21, 2011
: MySQL Query Optimizerはどこからインデックス統計を読み取りますか?MySQLとストレージエンジンのバージョンによって異なりますが、一般的には次のようになります。
OPTIMIZE TABLEテーブルを分析し、テーブルのキー分布を保存し、未使用のスペースを再利用し、データファイルを最適化します。
ANALYZE TABLEテーブルのみを分析し、キー分布を保存します。