2017-06-16 6 views
0

テーブルT 2列は、2つの索引を比較する:(b)と(a)の

a varchr(50) not null 
b varchr(50) not null 

を持っているだけ(例えばfoo1,foo2,...)を指定した検索シナリオの下

  • 検索を持つことができます(select a,b,status,count(*) where a in (xxx) group by a,b,status

  • 検索のみを(例えばbar1,bar2,...)(select a,b,status,count(*) where b in (xxx) group by a,b,status

  • Bを指定します
  • AおよびB(select a,b,status,count(*) where a in (xxx) and b in (xxx) group by a,b,status)を指定両方

は当然、例えば、aとbのインデックスを作成する必要があります

alter table t add key idx_a_b (a,b); 
alter table t add key idx_b (b); 

が、インデックスは、インデックス

alter table t add key idx_a (a); 
alter table t add key idx_b (b); 

以下との違いを持っ​​ている上に、私はそれが多分無視する可能性の違いを持っ​​ている場合と思えば今、私は疑問に思います。私は正しい?

+1

私が間違っていない場合、最初の例は、aのみを照会するとき、またはaとbを照会するときに使用されます。だから、3つではなく2つのインデックスしか必要ないので、少し効率的ですが、その差はごくわずかです。たぶん両方を試して、いくつかの説明とプロファイリングをしてください。 – FMashiro

答えて

0

最適なインデックスは(a, b, status)(b, status)です。

これらはすべて3つのクエリをカバーします。つまり、クエリのすべての列がインデックスに含まれています。これらは、最初の2つのクエリにも最適です。

3つ目は、2つのin句のために問題があります。フィルタリングを処理するインデックスは(MySQLでは)存在しません。

関連する問題