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


10

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

前もって感謝します..

回答:


10

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マルチバージョン」を参照してください。


5

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

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

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

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

ANALYZE TABLE tablename;

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


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