6

すべてのページからかなりの数のクエリが発行される Web アプリがあります。DB に追加されるデータが増えるにつれて、ページの読み込みに時間がかかるようになっていることに気付きました。

PhpMyAdmin -> Status -> Joins を調べたところ、次のことに気付きました (数字は赤で表示):

Select_full_join 348.6 k インデックスを使用しない結合の数。この値が 0 でない場合は、テーブルのインデックスを注意深く確認する必要があります。

  1. 問題の原因となっている結合を特定するにはどうすればよいですか? すべての結合が同じように非難されますか?
  2. 適切なパフォーマンスを得るために、どの列にインデックスを付ける必要があるかを判断するにはどうすればよいですか?

CakePHP + MySQL を使用しており、クエリはすべて自動生成されます。

4

2 に答える 2

10

私が常に使用してきた経験則は、結合を使用している場合、結合しているフィールドにインデックスを付ける必要があるということです。

たとえば、次のようなクエリがあるとします。

SELECT t1.name, t2.salary
    FROM employee AS t1 
    INNER JOIN info AS t2 ON t1.name = t2.name;

t1.name と t2.name の両方にインデックスを付ける必要があります。

以下は、これについても良い読み物です。

MySQL の最適化: JOIN 順序の重要性

インデックス作成によって MySQL JOIN クエリを最適化する方法

そして、一般的に、この男のサイトにはいくつかの良い情報もあります.

MySQL オプティマイザー チーム

編集:これは常に役に立ちます。

サーバー設定にアクセスできる場合は、以下を確認してください。

MySQL スロー サーバー ログ

スロー クエリのログを取得したら、explain を使用してインデックス作成が必要なものを確認できます。

于 2012-07-07T17:10:55.927 に答える
2

どのクエリが非効率的に実行されているかわからない場合は、いくつかの選択肢があります。

これを試すことができます:

SHOW FULL PROCESSLISTWeb サイトがアクティブな状態で、phpmyadmin からコマンドを発行してみてください。うまくいけば、実行速度の遅い一連のクエリが表示されます。FULLプロセスリストは、クエリ全体を提供する必要があります。次に、コマンドを使用して、EXPLAINそれが何をしているかを把握できます。

これも試してみてください:

アプリケーションがユーザーに代わって行っている作業についてよく考えてください。ユーザーに価値を提供するために、どのクエリが大量のデータを処理する必要があるかを考えてください。アプリケーションがますます使用されるにつれて、どのテーブルが成長しているかを考えてみてください。

次に、その値を提供し、成長するテーブルにアクセスするクエリを見つけます。繰り返しますが、EXPLAINコマンドを使用して MySQL がそれらをどのように処理しているかを確認し、必要に応じてインデックスを追加します。

どのインデックスを追加する必要があるかは非常に明白になると思います。明らかなものを追加してから、システムを数日間安定させてから、再測定してください。

これは、新しいアプリケーションを本番環境に導入する際の通常の部分であることに注意してください。

于 2012-07-07T15:43:31.397 に答える