web-dev-qa-db-ja.com

一括削除後にmysqlテーブルのインデックスを再作成する必要がありますか?

MySQLに、毎秒多くのINSERTとSELECTを実行するテーブルがあります。そして、1日に1回、古いデータの一括削除があります。削除後にテーブルのインデックスを再作成する必要がありますか?性能を上げたい。誰かがいくつかのヒントを提案できますか?ストレージエンジンとして「innodb」を使用する。変更する必要がありますか?同時挿入と選択の方が良いと思います。あなたの提案をお願いします。インデックスの再作成を行う必要がありますか?

前もって感謝します..

10
Ajay

InnoDBを使用するときにテーブルを最適化する必要がありますか?はい、いいえ。ワークロードや、パフォーマンスの問題が発生しているかどうかによって異なります。

MySQLドキュメント からの恥知らずなコピーペースト:

InnoDBテーブルの場合、OPTIMIZE TABLEはALTER TABLEにマップされます。これはテーブルを再構築して、インデックス統計を更新し、クラスター化インデックスの未使用スペースを解放します。これは、次に示すように、InnoDBテーブルで実行すると、OPTIMIZE TABLEの出力に表示されます。

mysql> OPTIMIZE TABLE foo;
+----------+----------+----------+-------------------------------------------------------------------+
| Table    | Op       | Msg_type | Msg_text                                                          |
+----------+----------+----------+-------------------------------------------------------------------+
| test.foo | optimize | note     | Table does not support optimize, doing recreate + analyze instead |
| test.foo | optimize | status   | OK                                                                |
+----------+----------+----------+-------------------------------------------------------------------+

この操作では、高速なインデックス作成は使用されません。キーは主キーに出現する順序で挿入されるため、副次索引はそれほど効率的に作成されません。セクション14.14.6「インデックスの高速作成の制限」を参照してください。

InnoDBは、ページ割り当て方法を使用してデータを格納し、レガシーストレージエンジン(MyISAMなど)が行うのと同じように断片化の影響を受けません。最適化を実行するかどうかを検討するときは、サーバーが処理するトランザクションのワークロードを考慮してください。

  • ある程度の断片化が予想されます。 InnoDBは、ページを分割することなく、更新の余地を残すために、ページを93%だけ埋めます。

  • 削除操作により、ギャップが残り、ページが必要以上に満たされなくなる可能性があるため、テーブルを最適化する価値がある場合があります。

  • 行を更新すると、十分なスペースが利用可能な場合、データ型と行形式に応じて、通常は同じページ内のデータが書き換えられます。セクション14.10.5「InnoDBテーブルの圧縮のしくみ」およびセクション14.12.1「InnoDB行ストレージの概要」を参照してください。

  • InnoDBはMVCCメカニズムを介して同じデータの複数のバージョンを保持するため、同時実行性の高いワークロードでは、時間の経過とともにインデックスにギャップが残る可能性があります。セクション14.5.12「InnoDBマルチバージョン」を参照してください。

10

テーブルのインデックスを再作成し、テーブルを縮小することもできます。ただし、このようなディスクベースのメンテナンスを遅らせたい場合は、少なくともインデックス統計を再計算する必要があります。

インデックス統計を再計算しないと、MySQL Query OptimizerはクエリEXPLAINプランに不適切な選択をする可能性があります。これは、存在しないデータの統計がまだ存在する場合、SELECTに悪影響を与える可能性があります。これはMyISAMとInnoDBの両方に当てはまります。

インデックス統計を計算するためにテーブルを縮小する必要はありませんが、全体的なパフォーマンスは向上します。

テーブル内のすべてのインデックスの統計を計算するには、 次のように実行します

ANALYZE TABLE tablename;

あなたは毎晩これを行うことができます。データの最適化や縮小は行われません。おそらく、OPTIMIZE TABLE tablename;を実行することで、これを週に1回行うことができます。これは、テーブルの物理ファイル(InnoDBの場合はANALYZE TABLE tablename;、MyISAMの場合は.ibd)の縮小後に.MYIも実行します。

5
RolandoMySQLDBA

InnoDBではOPTIMIZE TABLEはほとんど必要ありません。

年齢に基づいてレコードを削除していますか?その場合、PARTITIONingとDROP PARTITIONを使用して、「一括削除」を本質的に無料にすることができます。詳細はこちら: http://mysql.rjweb.org/doc.php/partitionmaint

3
Rick James