Viktigast av allt, du behöver ett index på playersinclubs(club_id, player_id)
. Resten är detaljer (som fortfarande kan göra stor skillnad).
Du måste vara exakt om dina faktiska mål. Du skriver:
Du behöver inte gå med i club
för detta överhuvudtaget:
SELECT p.*
FROM playersinclubs pc
JOIN player p ON p.id = pc.player_id
WHERE pc.club_id = 3;
Och du behöver inte kolumner playersinclubs
i utgången antingen, vilket är en liten vinst för prestanda - om det inte tillåter en endast index skanna på playersinclubs
, då kan det vara betydande.
Du behöver förmodligen inte alla kolumner för player
i resultatet heller. Endast SELECT
kolumnerna du faktiskt behöver.
PK på player
tillhandahåller indexet du behöver på den tabellen.
Du behöver ett index på playersinclubs(club_id, player_id)
, men gör inte göra det unikt om inte spelare inte får gå med i samma klubb en andra gång.
Om spelare kan gå med flera gånger och du bara vill ha en lista över "alla spelare", måste du också lägga till en DISTINCT
steg för att vika dubblettposter. Du kan bara:
SELECT DISTINCT p.* ...
Men eftersom du försöker optimera prestanda:det är billigare att eliminera duperingar tidigt:
SELECT p.*
FROM (
SELECT DISTINCT player_id
FROM playersinclubs
WHERE club_id = 3;
) pc
JOIN player p ON p.id = pc.player_id;
Kanske vill du verkligen ha allt inlägg i playersinclubs
och alla kolumner i tabellen också. Men din beskrivning säger något annat. Fråga och index skulle vara annorlunda.
Närbesläktat svar: