2016-05-16 16 views
0

私は、where句に外部キーと他の列(たとえばc1)を使用するクエリを持っています。既定では、外部キーのインデックスが作成されます。私はc1にインデックスを追加して、Explainコマンドを実行すると、クエリは索引付けされたc1ではなく、検索のための外部キーのみを使用します。MYSQL複数列インデックス

私は外部キーと他の列の両方に対して単一のインデックスを作成するはずです。私は索引付けに関するコメントを読もうとしましたが、どんな提案も本当に感謝しています。

表: 学生:ID、名前、年、Class_tutor_id

ClassTutor:ID、名前 でClass_tutor_idは学生 から

選択名(ClassTutorからIDを選択する場所名= 'サリー') および年> = 200および年< = 2006;

年のフィールドにインデックスを作成しました。 Class_tutor_idはClassTutorテーブルIDを参照する外部キーです。私はExplainコマンドでクエリを実行すると、 "キー"列の下で外部キーClass_tutor_idを取得しますが、 "可能なキー"列には外部キー、主キー、年を取得します

+2

質問を編集し、クエリとテーブル定義(または少なくともインデックス)を表示します。実際に自信を持って指導するための情報は不十分です。 –

答えて

0
+0

各列に別々のインデックスを使用する必要があります。別のインデックスを作成しました。 "EXPLAIN"コマンドでは、 "index merge"をタイプカラムに取得しませんでした。新しく作成された索引は考慮されません。それを行う他の手段はありますか? – User12121

+0

where句に2つの別々のインデックスを使用することはできません。 2つの列を使用する場合は、両方の列を含む新しい索引を作成する必要があります。 –

+0

両方のインデックスを含む新しいインデックスを作成すると、外部キーのみが使用されます。それはうまくいかなかった。新しいインデックスも使用されていません – User12121

0

IN (SELECT ...)を使用しないでください。パフォーマンスが低下します。使用JOIN代わりに:

Select s.name 
    from Student AS s 
    JOIN ClassTutor AS ct ON ct.id = s.Class_tutor_id 
    where ct.name='Sally' 
     and s.year>=200 
     and s.year<=2006; 
その後

これらの指標の一つに使用され、 '最適' である:

Student: INDEX(year) 
ClassTutor: INDEX(name, id) -- "composite" and "covering" 

しないでくださいUSEFORCEINDEX。今日は助けになるかもしれませんが、明日は傷つきます。

"各列の個別のインデックス"は、 "複合"インデックスの能力を習得していないことを意味します。私のcookbookを参照してください。

FOREIGN KEYは、この説明では赤いヒアリングです。必要なインデックスに焦点を当てます。

関連する問題