Soprattutto, hai bisogno di un indice su playersinclubs(club_id, player_id)
. Il resto sono dettagli (che possono comunque fare la differenza).
Devi essere preciso sui tuoi obiettivi reali. Scrivi tu:
Non è necessario iscriversi al club
proprio per questo:
SELECT p.*
FROM playersinclubs pc
JOIN player p ON p.id = pc.player_id
WHERE pc.club_id = 3;
E non hai bisogno delle colonne playersinclubs
anche nell'output, che è un piccolo guadagno per le prestazioni, a meno che non consenta un solo indice scansiona su playersinclubs
, allora potrebbe essere sostanziale.
Probabilmente non ti servono tutti colonne di player
anche nel risultato. Solo SELECT
le colonne di cui hai effettivamente bisogno.
Il PK su player
fornisce l'indice di cui hai bisogno su quella tabella.
Hai bisogno di un indice su playersinclubs(club_id, player_id)
, ma non rendilo unico a meno che ai giocatori non sia consentito entrare nello stesso club una seconda volta.
Se i giocatori possono unirsi più volte e vuoi solo un elenco di "tutti i giocatori", devi anche aggiungere un DISTINCT
passo per piegare le voci duplicate. Potresti semplicemente:
SELECT DISTINCT p.* ...
Ma dal momento che stai cercando di ottimizzare le prestazioni:è più economico eliminare i duplicati in anticipo:
SELECT p.*
FROM (
SELECT DISTINCT player_id
FROM playersinclubs
WHERE club_id = 3;
) pc
JOIN player p ON p.id = pc.player_id;
Forse vuoi davvero tutto voci in playersinclubs
e anche tutte le colonne della tabella. Ma la tua descrizione dice il contrario. La query e gli indici sarebbero diversi.
Risposta strettamente correlata: