2011-09-19 7 views
7

下記のクエリを参照してください。クエリがインデックスを使用し、一時的なファイルとファイルの使用を避けるように、テーブルで作成するインデックスは何ですか?私はインデックスの多くの異なる組み合わせを試して、advice hereを読むが、私はそれを把握していないようだ。私の説明はUsing Where(インデックスなし)、またはUsing Where Using Temporary, Using Filesortグループバイス/オーダーのMySQLインデックス

ここでは簡単なクエリです。すべての列は整数です。経験によって

SELECT c1, Sum(c2) 
FROM table 
WHERE c3 IS NOT NULL 
AND c4 = 2011 
AND c5 = 0 
AND c6 In (6,9,11) 
GROUP BY c1 
+1

MySQLはテーブルごとに1つのインデックスしか使用できないので、GROUP BYを最適化するためにインデックスにインデックスを置くと、WHERE句が最適化されず、最終的にはより多くの作業が行われるため、 (すなわち全テーブルスキャン)。 –

+3

私はそれを理解していますが、GROUP BY句とWHERE句の両方で使用できる単一のインデックスを作成する方法はありますか? – bradvido

答えて

7

これはあなたに役立つでしょう。次のようにクエリを書き直し:

SELECT c1, Sum(c2) 
FROM table 
WHERE c4 = 2011 
AND c5 = 0 
AND c6 In (6,9,11) 
AND c3 IS NOT NULL 
GROUP BY c1 

は今、この順序で列の列(C4、C5、C6)の複合インデックスを作成します。索引の列は、WHERE句の列と同じ順序で表示されます。そうしないと、索引は機能しません。このインデックスの選択性は、一時テーブルのファイル・セット(グループの場合)が高速でなければならないほど狭いです。

c3をクエリの最後に移動する理由は次のとおりです。例として、c3は0と100の間の値を取ることができると仮定します(またはNULLにすることもできます)。 "IS NOT NULL"クエリを実行する場合、MysqlはNULLに対応するエッジを除いてBツリーインデックスのほとんどすべてをトラバースする必要があります。したがって、MySQLは、インデックス内のすべての異なるパスを調べるよりも、完全なテーブルスキャンが簡単なオプションであると判断します。一方、クエリが "IS NULL"でインデックスが(c3、c4、c5、c6)の場合、Mysqlはこのインデックスを実際に使用することになります。これは、この場合、MysqlはNULL値に対応するインデックスツリーの部分をトラバースする必要があるからです。

MySQLが必要とするインデックスの種類は、問題のクエリに非常に依存しています。 @louisが示唆しているように、すべての列にインデックスを作成するのは良い考えではありません!

+0

詳細な説明をありがとう! – bradvido

+5

"インデックスの列は、WHERE句の列と同じ順序で表示されます。そうしないと、インデックスは機能しません。問合せオプティマイザは、 'WHERE'句がどのように順序付けられているか気にしません。 'SELECT ...FROM foo WHERE bar = 1 AND baz <5'は、SELECT ... FROM foo WHERE baz <5 AND bar = 1'とまったく同じ実行計画を持ち、まったく同じ方法でインデックスを使用します。条件のタイプ(平等または不等式、選択的かどうか)は重要であり、WHERE句のどこに現れないかは重要です。 – Air

+0

これが本当であるかわかりません。私の経験から、インデックス定義の順序は重要ですが、where句の順序は重要ではありません。 –

-1

、私が言う必要があります: "どこ" 節(しかしここでは、ありませんC6)

少なくとも、C4とC5のすべての列のインデックスを構築します。

"group by"句で結果を並べ替えます。あなたが結果にたくさんのレコードを持っているなら、それはc1もインデックスするのに役立つかもしれません。

c3は "not null"としてのみテストされます。しかし、それはまた、物事を改善することができますインデックスを作成、これはテストされることです。

ホップこれは役に立ちました。

0

私はこの問題が 'ORDER BY 2 DESC'という条項であると信じています。たとえc2がインデックスされていてもSUM(C2)はそうではありません。

あなたが持っているはずのインデックスは、データに依存しているので、私は実際にはコメントできません。

+0

議論のために、私はORDER BY句を使用していないとしましょう。 (私は質問からそれを削除しました)。私はまだ働くインデックスを見つけることができません。 – bradvido

関連する問題