Vigtigst af alt har du brug for et indeks på playersinclubs(club_id, player_id)
. Resten er detaljer (der kan stadig gøre en stor forskel).
Du skal være præcis omkring dine faktiske mål. Du skriver:
Du behøver ikke tilmelde dig club
til dette overhovedet:
SELECT p.*
FROM playersinclubs pc
JOIN player p ON p.id = pc.player_id
WHERE pc.club_id = 3;
Og du behøver ikke kolonner playersinclubs
enten i outputtet, hvilket er en lille gevinst for ydeevnen - medmindre det tillader en kun indeks scan på playersinclubs
, så kan det være væsentligt.
Du har sandsynligvis ikke brug for alle kolonner af player
enten i resultatet. Kun SELECT
de kolonner, du faktisk har brug for.
PK'en på player
giver det indeks, du har brug for på den tabel.
Du skal bruge et indeks på playersinclubs(club_id, player_id)
, men gør ikke gør det unikt, medmindre spillere ikke får lov til at blive medlem af den samme klub en anden gang.
Hvis spillere kan deltage flere gange, og du bare vil have en liste over "alle spillere", skal du også tilføje en DISTINCT
trin for at folde duplikerede poster. Du kunne bare:
SELECT DISTINCT p.* ...
Men da du forsøger at optimere ydeevnen:det er billigere at eliminere duper tidligt:
SELECT p.*
FROM (
SELECT DISTINCT player_id
FROM playersinclubs
WHERE club_id = 3;
) pc
JOIN player p ON p.id = pc.player_id;
Måske vil du virkelig have alt poster i playersinclubs
og alle kolonner i tabellen også. Men din beskrivelse siger noget andet. Forespørgsel og indeks ville være anderledes.
Nært beslægtet svar: