2
select a
from t
where b = 1 and c = 2 
  1. このクエリのパフォーマンスを向上させるには、最初のインデックスを作成する必要がありますか、それとも十分ですかindex (b, c)index(c, b)
  2. 私が理解していることから、index (b, c, a)パフォーマンスがさらに向上する可能性がありますが、(b, c, a)がよりもユニークである場合に限り(b, c)ます。あれは正しいですか?
  3. SQLの質問はdba.stackexchangeサイトに属していますか?
4

2 に答える 2

3

1.このクエリのパフォーマンスを向上させるには、インデックス(b、c)とインデックス(c、b)を作成する必要がありますか、それとも最初のインデックスで十分ですか?

両方のインデックスを作成する必要はありません。2つのうちのいずれかをクエリの実行に使用すると、このタイプのクエリ(where b = 1 and c = 2条件付き)の効率が同等に向上する可能性があります。使用するかどうか、パフォーマンスを向上させるかどうかは、インデックスの選択性によって異なります。

2.私が理解していることから、インデックス(b、c、a)はパフォーマンスをさらに向上させる可能性がありますが、(b、c、a)が(b、c)よりも一意である場合に限ります。あれは正しいですか?

はい。のインデックス(b , c, a)(または(c, b, a)同様に1つのインデックス)は、パフォーマンスを向上させます。選択性に依存しない。(b, c)インデックスを読み取る(およびインデックス内の同じ場所からすべて)を読み取ることは、(インデックスを読み取りa、(おそらくはるかに広い)テーブルからここと別の行から列データを取得することよりも悪いことはありません。

クエリが返す行数などの選択性は(b, c)、効率の向上に影響し、(b, c, a)インデックスによって得られます。クエリが数十行を返す場合、違いはわずかです。クエリが数百万のテーブルのうち数千の行を返す場合、すべてのデータが(カバーする)インデックスから読み取られるため、改善は大きくなります。

3. SQLの質問はdba.stackexchangeサイトに属していますか?

これは、メインサイトまたはDBA.SEメタのいずれかのメタサイトに対する質問です。

于 2013-02-12T22:15:29.180 に答える
2
  1. 両方の列に必要なインデックスは1つだけです。2つのうちどちらが優れているかは、テーブルの構造とそれを使用するクエリによって異なりますが、通常、複合インデックスの順序と大きな違いはありません。

  2. クエリで使用されるすべての列をカバーするインデックスは、と呼ばれますcovering index。パフォーマンスを向上させることはできますが、テーブルに多数の列があるか、非常に大きい場合を除いて、通常、大きな違いはありません。より高速にできる理由は、インデックス内のエントリを見つけた後にデータに移動する代わりに、インデックスを使用するだけで、必要なものはすべてインデックス内にあるため、データを調べる必要がないためです。

  3. いくつかの質問はdbaに適していますが、これはここでは問題ありません。これはあまり技術的ではないため、ここに移行された可能性もあります。

最初の2つの部分については、一般的な考え方は「依存する」というものです。あなたの状況では、おそらく大量のデータを処理していないので、どちらの方向に進んでも大きな違いはありません。顕著な違いがあるためには、おそらくテーブルに少なくとも10MBのデータが必要です。

于 2013-02-12T21:50:41.277 に答える