私はStackOverflowの上で同様の質問がある知っているが、私のテーブルの上に別のインデックスをテストした後、私はかなりのインデックスがどのように動作するかを理解していないと思うし、誰かができれば、私はそれが欲しいですクエリのパフォーマンスについて、私が経験している動作を説明してください。私は例として、このクエリを使用してい複数の単一フィールドインデックス対複数フィールドインデックス
は、私は詳細にそれを説明しようとするつもりです:
SELECT ss1.PlayerID, ss1.Name, ss1.Series, ss1.LanesNum, ss1.Date, ss1.LeagueName, ss1.Season FROM SeriesScores ss1
JOIN (SELECT Series, Gender, LanesNum, Bowlout, Season FROM SeriesScores
WHERE Gender = ? AND LanesNum = ? AND Series > -1 AND Bowlout = 'No' AND Season = '2011-2012'
ORDER BY Series DESC LIMIT 0,?) as ss2
USING(series, gender, lanesNum, bowlout, season)
ORDER BY ss1.Series DESC
この問合せは、各ペアのために与えられたシーズンでボーリング最高のシリーズを取得するために使用されますボウリング場の男性と女性の両方のための車線の。
車線の所定の対のネクタイがあります場合、私はすべての名前が出てくるしたいので、私は自分自身に、テーブルに参加する代わりに、MAX集計関数を使用しています。
基本的に、私は内部SELECTが返すものと一致するすべてのフィールドを結合します。その内側のSELECTは、特定の性別と与えられた1組のレーンのトップXプレーヤーを返します。
使用した部分は、私が選択します探していますと同じ性別、シリーズ、lanesNumや季節で、出て圧倒されていないことを確認選手だけになります。私は最高のシリーズから最も低いシリーズまで注文します。
このクエリはforループにあり、男性の場合は12回、女性の場合は12回(ボーリングセンターの12ペアのレーン)、レーン番号と性別パラメータのみが変更されます。
私は、アプリケーション(男性用1つのベクトル、女性のための1)で結果を表示するには、Javaで二つの異なるベクトルですべての結果を置きます。
インデックスがまったくなくても、結果をベクトルとそのすべてに入れることを含むすべてを実行するには約11秒かかります。 (男性12問で5.5秒、女性で12秒)。 (性別、lanesNum、シリーズ)上のインデックスを持つ
それは私のニーズのために許容可能な速度よりもより多くのだから、それは、驚くべきである、全体のことのために0.04秒かかります。
私はWHERE句で使用している最も重要なフィールドなのでインデックスを使用しましたが、他のものを試して実際に他のインデックスを使用していたため、私の質問は100%以上低かった。また、もし私が "ボウルアウト"と "シーズン"をそのインデックスに追加すれば、より高速なクエリを得ることができるのだろうかと思っています。
最初に列のインデックスを1つ試し、パフォーマンスをテストしたかったのです。それはそれらのクエリのすべてを合計22秒にするインデックスです。
私は索引をどこで使うべきか、複数のフィールドで使うべきか、単一のフィールドで複数の索引を使うべきなのか分かりませんでした。また、私は理解しませんどのように(間違った)インデックスを使用すると実際にパフォーマンスが悪化する可能性があります。ただ一つのクエリのためにあまりにもaggresivelyインデックスを最適化
非常に明確で詳細な回答、ありがとう!このクエリは単純なので、他のインデックスを作成するのにあまり役に立たないと言ったときの簡単な質問です...私は他の(時にはもっと複雑な)クエリを持っているので、同じテーブルを使用する他のクエリのインデックスを追加するほうが有益ですデータベースが代わりに他のインデックスを使用する必要があると考える場合、このクエリを遅くすることができますか?それ以外は、私はすべてを得ると思う、おかげで! –
私が最初に言ったように、これは単一の質問精神運動のみでした。一度あなたは複数のクエリを持っている、あなたはそれらのすべてのまともなパフォーマンスが欲しいでしょう。テーブルごとに1つのインデックスを用意して、すべてのテーブルに対応できるようにしたい場合がありますが、必ずしもそうである必要はありません。統計が更新されると、追加のインデックスは、クエリの最初の実行中またはクエリオプティマイザ自体がすばらしい仕事を実行できない場合を除いて、減速を引き起こしてはいけません。 –
@Adam - 前回のコメントで最初に実行したときの非常に小さな減速は、クエリを評価するために使用できるさまざまなアルゴリズムを評価するクエリオプティマイザです。その後、同じクエリに対して勝利アルゴリズム(いわゆるクエリプラン)が再利用されます。 –