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 :