最も重要なのは、playersinclubs(club_id, player_id)
のインデックスが必要です 。残りは詳細です(それでもかなりの違いが生じる可能性があります)。
実際の目標について正確にする必要があります。あなたが書く:
club
に参加する必要はありません このために:
SELECT p.*
FROM playersinclubs pc
JOIN player p ON p.id = pc.player_id
WHERE pc.club_id = 3;
また、列は必要ありませんplayersinclubs
出力でも、これはパフォーマンスのわずかな向上です。ただし、インデックスのみが許可されている場合を除きます。 playersinclubs
でスキャン 、それならかなりの量になるかもしれません。
おそらくすべては必要ありません player
の列 結果としても。 SELECT
のみ 実際に必要な列。
player
のPK そのテーブルに必要なインデックスを提供します。
playersinclubs(club_id, player_id)
のインデックスが必要です 、ただししない プレーヤーが同じクラブに2回参加することを許可されていない限り、それをユニークにします。
プレーヤーが複数回参加でき、「すべてのプレーヤー」のリストが必要な場合は、DISTINCT
も追加する必要があります。 重複するエントリを折りたたむ手順。あなたはただ:
SELECT DISTINCT p.* ...
ただし、パフォーマンスを最適化しようとしているため、重複を早期に排除する方が安価です:
SELECT p.*
FROM (
SELECT DISTINCT player_id
FROM playersinclubs
WHERE club_id = 3;
) pc
JOIN player p ON p.id = pc.player_id;
たぶんあなたは本当にすべてが欲しい playersinclubs
のエントリ テーブルのすべての列も。しかし、あなたの説明はそうではないと言っています。クエリとインデックスは異なります。
密接に関連する答え: