Het belangrijkste is dat je een index op playersinclubs(club_id, player_id)
nodig hebt . De rest zijn details (die nog steeds een groot verschil kunnen maken).
Je moet precies zijn over je werkelijke doelen. Je schrijft:
Je hoeft niet lid te worden van club
hiervoor helemaal:
SELECT p.*
FROM playersinclubs pc
JOIN player p ON p.id = pc.player_id
WHERE pc.club_id = 3;
En je hebt geen kolommen playersinclubs
nodig in de uitvoer, wat een kleine winst is voor de prestaties - tenzij het een alleen-index . toestaat scan op playersinclubs
, dan kan het aanzienlijk zijn.
Je hebt waarschijnlijk niet alle nodig kolommen van player
ook in het resultaat. Alleen SELECT
de kolommen die u echt nodig heeft.
De PK op player
biedt de index die u nodig heeft voor die tabel.
Je hebt een index nodig op playersinclubs(club_id, player_id)
, maar doe niet maak het uniek, tenzij spelers niet voor de tweede keer lid mogen worden van dezelfde club.
Als spelers meerdere keren kunnen deelnemen en je wilt alleen een lijst met "alle spelers", moet je ook een DISTINCT
toevoegen stap om dubbele vermeldingen te vouwen. Je zou gewoon:
SELECT DISTINCT p.* ...
Maar aangezien u de prestaties probeert te optimaliseren:het is goedkoper om dupes vroegtijdig te elimineren:
SELECT p.*
FROM (
SELECT DISTINCT player_id
FROM playersinclubs
WHERE club_id = 3;
) pc
JOIN player p ON p.id = pc.player_id;
Misschien wil je echt alles inzendingen in playersinclubs
en ook alle kolommen van de tabel. Maar je beschrijving zegt iets anders. Query en indexen zouden anders zijn.
Nauw verwant antwoord: