結合のためにフィールドを頻繁に使用することがわかっている場合は、そのフィールドにインデックスを作成することをお勧めします。
私は一般的に、表の索引付けの概念を理解しています (紙の本の索引を使用すると、ページごとに検索しなくても特定の用語を検索できるようになります)。しかし、いつそれらを使用するかについてはあまり明確ではありません。
USERS、COMMENTS、および VOTES テーブルの 3 つのテーブルがあるとします。そして、クエリがコメントとそれらのコメントに対する上/下の投票数を返す、Stackoverflow のようなコメント スレッドを作成したいと考えています。
USERS table
user_id user_name
1 tim
2 sue
3 bill
4 karen
5 ed
COMMENTS table
comment_id topic_id comment commenter_id
1 1 good job! 1
2 2 nice work 2
3 1 bad job :) 3
VOTES table
vote_id vote comment_id voter_id
1 -1 1 5
2 1 1 4
3 1 3 1
4 -1 2 5
5 1 2 4
topic_id=1 の投票を返すクエリと SQLFiddle は次のとおりです。
select u.user_id, u.user_name,
c.comment_id, c.topic_id, c.comment,
count(v.vote) as totals, sum(v.vote > 0) as yes, sum(v.vote < 0) as no,
my_votes.vote as did_i_vote
from comments c
join users u on u.user_id = c.commenter_id
left join votes v on v.comment_id = c.comment_id
left join votes my_votes on my_votes.comment_id = c.comment_id
and my_votes.voter_id = 1
where c.topic_id = 1
group by c.comment_id, u.user_name, c.comment_id, c.topic_id, did_i_vote;
コメントと投票の数が数百万になると仮定しましょう。クエリを高速化するために、私の質問は、にインデックスを配置する必要があるcomments.commenter_id
かvotes.voter_id
どうvotes.comment_id
かです。