web-dev-qa-db-ja.com

いつデータベースインデックスを再構築する必要がありますか?

私は here を介して大規模な低速SQLクエリをリファクタリングすることについて読んでいましたが、現在の最高の応答は、クエリが主要な選択にインデックスを使用することを確認したいMitch Wheatからのもので、次のように述べています。

最初に行うことは、アクティブなインデックスメンテナンスジョブが定期的に実行されていることを確認することです。そうでない場合は、既存のすべてのインデックスを再構築するか、それが不可能な場合は少なくとも統計を更新します。

私はアマチュアDBAだけです。基本的にJavaデスクトップクライアントと、場合によってはMySQLバックエンドです。)をいくつかのフリーランスで作成しました。システムをセットアップすると、照会される列のインデックスには、varchar CaseIDとvarchar CustNameがあります。

しかし、私はこのシステムを数か月前にセットアップし、クライアントがそれを操作したままにしました。データが入力されるとインデックスが大きくなるはずであり、すべてがまだうまく機能していると思います。しかし、インデックスを定期的に再構築する必要があるのではないかと心配しています。今日、「アクティブなメンテナンスジョブ」があるはずだと読んだためです。私が設定した唯一のメンテナンスジョブは、毎晩のバックアップでした。

データベースに必要な定期的なメンテナンスについてコミュニティに質問したかったのです。インデックスを再構築する必要はありますか? MySQLバックエンドを信頼して、誰もそれをいじらず、データが数ギガバイト未満である限り、続けることができますか?

26
Karl

インデックスを「再構築」する必要はありません。それらは常に最新の状態に保たれます。たぶん彼はテーブルの再構築について言及していたのでしょう。使用パターンとスキーマに応じて、断片化されたページをInnoDBで取得できます。また、MyISAMでも取得できると思います。テーブルを再構築すると、ディスク上のデータの断片化が解消され、パフォーマンスが向上します。 MyISAMテーブルを定期的に使用していませんが、特定の使用パターンで「OPTIMIZE TABLE」を実行することをお勧めします。 MyISAMとInnoDBの両方に関する優れた情報については、MySQLのドキュメント OPTIMIZE TABLE を参照してください。

MyISAMの複雑さについてはあまり詳しくありませんが、InnoDBでは統計が古くなる可能性があることは事実です。データベースは、特定のインデックスに対してデータがどのように分散されているかに関する推定統計を保持し、それらが古くなる可能性がありますが、MySQL/InnoDBには統計を最新に保つための組み込み機能がいくつかあります。通常、心配する必要はありません。

したがって、InnoDBを使用している場合の答えは「いいえ」です。通常、インデックスのパフォーマンスを維持するために積極的に何かをする必要はありません。 MyISAMについてはよくわかりませんが、これらのテーブルを定期的に最適化する必要があるのが一般的だと思います。

24
nathan

通常は、インデックスを最適化してエラーをチェックするようにcronjobを設定することをお勧めします。

mysqlcheck を参照してください。典型的なcronジョブはmysqlcheck -Aaosのように見えます。これは、すべてのデータベースのすべてのテーブルにエラーがないかチェックし、インデックスを最適化して、エラー時にのみ出力します。

11
Eli

「定期的なメンテナンス」についてあなたがリンクした回答は、定期的に切り捨てられて再入力される一時テーブルの特定のコンテキストにありました。 MySQLデータベースのインストールの大部分に対してこれを行う必要はありません。

2
staticsan