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


29

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

回答:


28

@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;

MyISAM

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

InnoDB(innodb_file_per_tableが有効)

各テーブルのデータとインデックスは、外部テーブルスペースファイルに保存されます。以下のためにdatadirIS /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配管

更新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;

これらの手順を自分で実行することもできます。

ただし、正直なところ、ANALYZE TABLEクエリが実行されるたびにInnoDBストレージエンジンはインデックス内のページの通過に基づいてテーブルのカーディナリティの推定を実行するため、InnoDBテーブルに対して実行する必要はありません。数が多いがある場合はINSERTsUPDATEsDELETEs、あなたがする必要がありますANALYZE TABLE。高い数がある場合DELETEs、次にALTER TABLE mydb.mytable ENGINE=InnoDB;テーブルを縮小するために必要とされます。

私は実際にANALYZE TABLE、特定のインスタンスでのInnoDB の無益さに関する投稿を書きました。


innodbの最適化テーブルはサポートされていないと思います。メッセージを受け取りました。インデックスが再作成されます。どのように機能しますか?
ブール値

@RolandoMySQLDBA「実行できない」と言ったとき、どういう意味かわかりませんOPTIMIZE TABLE。あなたがするとOPTIMIZE TABLEのInnoDBテーブルのために、MySQLが実行されるALTER TABLE ... ENGINE=InnoDBANALYZE TABLE ...、あなたのための操作をそれが言うとき、「再作成が+の代わりにテーブルを分析すること。」
マイケル-sqlbot

@ Michael-sqlbot私の答えに示されているように、OPTIMIZE TABLE dat;MySQL 5.5.29で走りましたが、すぐに文句を言いましたTable does not support optimize, doing recreate + analyze instead。それが私がお勧めする理由ですALTER TABLE dat ENGINE=InnoDB; ANALYZE TABLE dat;
RolandoMySQLDBA

確かに、テストしたテーブルが非常に小さかったため、すぐにそれが起こったと断言します。いつOPTIMIZE TABLEInnoDBの上、サーバーは実際に、実際に実行しないALTER TABLE ... ENGINE=InnoDBと、ANALYZE TABLE舞台裏でその応答を返す前に...あなたが実際に実行できるようにOPTIMIZE TABLEInnoDBテーブルの上に、そして意図した効果を実現します。
マイケル-sqlbot

15

MySQLとストレージエンジンのバージョンに依存しますが、一般的には:

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.