web-dev-qa-db-ja.com

MySQLのテーブルの最適化と分析テーブルの違いは何ですか

Mysqlのテーブルの最適化とテーブルの分析の違いは何ですか?私はオンラインドキュメントを読みましたが、何が違うのかわかりません。

31
Boolean

@ MitchWheatの回答 (最初に直接回答する場合は+1)を展開するには:

ANALYZE TABLE はキーの分布を調べ、 INFORMATION_SCHEMA.STATISTICS

OPTIMIZE TABLEANALYZEを実行しますTABLE テーブル圧縮を行った後。テーブルがMyISAMであった場合のOPTIMIZE TABLE mydb.mytable;と同等のものは次のとおりです。

ALTER TABLE mydb.mytable ENGINE=MyISAM;
ANALYZE TABLE mydb.mytable;

MyISAM

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と同じではありません。違いは次のとおりです。

InnoDB( innodb_file_per_table が有効)

各テーブルのデータとインデックスは、外部テーブルスペースファイルに保存されます。 datadir/var/lib/mysqlでテーブルmydb.mytableの場合、次のように格納されます。

  • /var/lib/mysql/mydb/mytable.frm
  • /var/lib/mysql/mydb/mytable.ibd

OPTIMIZE TABLE mydb.mytableを実行すると、mytable.ibdが縮小されます。

InnoDB( innodb_file_per_table 無効)

存在するのは/var/lib/mysql/mydb/mytable.frmだけです。テーブルmydb.mytableのすべてのデータページとインデックスページは、システムテーブルスペースファイル/var/lib/mysql/ibdata1に格納されます。

OPTIMIZE TABLE mydb.mytableが実行されると、データページとインデックスページがibdata1に連続して書き込まれます。残念ながら、これによりibdata1は飛躍的に成長します。

Percona CTO Vadim Tkachenkoの図解をご覧ください

InnoDB Plumbing

2013-02-26 22:33 EST更新

あなたのコメントは

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ストレージエンジンがインデックス内のページのパススルーに基づいてテーブルのカーディナリティを推定するためです。 INSERTsUPDATEs、およびDELETEsの数が多い場合は、ANALYZE TABLEが必要です。 DELETEsの数が多い場合、テーブルを圧縮するためにALTER TABLE mydb.mytable ENGINE=InnoDB;が必要です。

実際に、特定の場合にInnoDBでANALYZE TABLEの無益性について投稿しました。

29
RolandoMySQLDBA

MySQLとストレージエンジンのバージョンによって異なりますが、一般的には次のようになります。

OPTIMIZE TABLEテーブルを分析し、テーブルのキー分布を保存し、未使用のスペースを再利用し、データファイルを最適化します。

ANALYZE TABLEテーブルのみを分析し、キー分布を保存します。

15
Mitch Wheat