Plus important encore, vous avez besoin d'un index sur playersinclubs(club_id, player_id) . Le reste n'est que détails (qui peuvent encore faire une grande différence).
Vous devez être précis sur vos objectifs réels. Vous écrivez :
Vous n'avez pas besoin d'adhérer au club pour ça du tout :
SELECT p.*
FROM playersinclubs pc
JOIN player p ON p.id = pc.player_id
WHERE pc.club_id = 3;
Et vous n'avez pas besoin des colonnes playersinclubs dans la sortie non plus, ce qui est un petit gain pour les performances - à moins qu'il n'autorise un index uniquement scanner sur playersinclubs , alors il peut être substantiel.
Vous n'avez probablement pas besoin de tout colonnes de player dans le résultat non plus. Uniquement SELECT les colonnes dont vous avez réellement besoin.
Le PK sur player fournit l'index dont vous avez besoin sur cette table.
Vous avez besoin d'un index sur playersinclubs(club_id, player_id) , mais ne le faites pas rendez-le unique à moins que les joueurs ne soient pas autorisés à rejoindre le même club une seconde fois.
Si les joueurs peuvent rejoindre plusieurs fois et que vous voulez juste une liste de "tous les joueurs", vous devez également ajouter un DISTINCT étape pour plier les entrées en double. Vous pouvez simplement :
SELECT DISTINCT p.* ...
Mais puisque vous essayez d'optimiser les performances :il est moins coûteux d'éliminer les doublons plus tôt :
SELECT p.*
FROM (
SELECT DISTINCT player_id
FROM playersinclubs
WHERE club_id = 3;
) pc
JOIN player p ON p.id = pc.player_id;
Peut-être que vous voulez vraiment tout entrées dans playersinclubs ainsi que toutes les colonnes du tableau. Mais votre description dit le contraire. La requête et les index seraient différents.
Réponse étroitement liée :