2017-04-20 8 views
1

このクエリは異なるものがたくさんあります。このクエリに設定するインデックスは何ですか?

  • が選択
  • これらの列が異なるテーブルからある特定の列のみを
  • 持つ連結/
  • をグループ化加入数/ケース


SELECT st.id AS stid, 
    st.category, 
    st.maxsubscriptions, 
    CONCAT (
     st.category, 
     ' (', 
     COUNT(CASE 
       WHEN gs.id_subtournament = st.id 
        THEN 1 
       ELSE NULL 
       END), 
     '/', 
     st.maxsubscriptions, 
     ')' 
     ) AS ststring 
FROM de_subtournaments AS st 
LEFT JOIN de_gamers AS gs ON st.id = gs.id_subtournament 
WHERE st.type = 0 
    AND st.id_tournament = '6' 
GROUP BY st.id 

このクエリのインデックスはどのように見えるのですか?

+0

あなたがそれによってフィルタリングしたり、それに参加し、それをインデックスを検討しようとしている場合。 – JNevill

+0

私はst.id、gs.id_subtournament、st.type + st.id_tournamentのそれぞれに1つのインデックスを作成する必要がありますか?合計で3つのインデックスがあります。そうですか? – sharkyenergy

+0

'st.id'のインデックスは使用されません。 'JOINing'を実行すると、どの表が最初にあるかを知ることができます.2番目の表には索引が必要です。 'LEFT'は通常、テーブルに命令を強制します。 –

答えて

1

以下は、私は維持することをお勧め指標は以下のとおりです。

あなたがについて typeを世話されていないが、それはにISN場合(また、次のインデックスを作成することを検討 id_tournamentため de_subtournamentsに対して実行する必要がある他のクエリを持っている場合は
`de_subtournaments`: `id`, unless it's the primary key already with an index 
`de_subtournaments`: `type` + `id_tournament` 
`de_gamers`: `id_subtournament`, unless the foreign key already has an index 

すでに外部キーが存在しています)。

0

これは索引の質問以外の問合せ作成の問題です。

JOINGROUP BYを持っていることに注意してください。私は、 "膨らんだ - 収縮"パターンと呼んでいます。それは高価なことがあります。

このようなクエリを高速化するためのトリックは、GROUP BYを取り除き、JOINをサブクエリに変換することです。今

SELECT st.id AS stid, st.category, st.maxsubscriptions, 
CONCAT (st.category, 
     ' (', 
     IFNULL(
       (SELECT COUNT(*) 
         FROM de_gamers 
         WHERE id_subtournament = st.id), 
       0), 
     '/', 
     st.maxsubscriptions, 
     ')' 
     ) AS ststring 
    FROM de_subtournaments AS st 
    WHERE st.type = 0 
     AND st.id_tournament = '6' 

は、インデックスを再確認します

st: INDEX(type, id_tournament) -- in either order 
de_gamers: (id_subtournament) 
関連する問題