Am wichtigsten ist, dass Sie einen Index für playersinclubs(club_id, player_id)
benötigen . Der Rest sind Details (die immer noch einen großen Unterschied machen können).
Sie müssen Ihre tatsächlichen Ziele genau angeben. Du schreibst:
Sie müssen dem club
nicht beitreten dafür überhaupt:
SELECT p.*
FROM playersinclubs pc
JOIN player p ON p.id = pc.player_id
WHERE pc.club_id = 3;
Und Sie brauchen keine Spalten playersinclubs
auch nicht in der Ausgabe, was ein kleiner Leistungsgewinn ist - es sei denn, es erlaubt einen Nur-Index Scannen Sie auf playersinclubs
, dann kann es erheblich sein.
Sie brauchen wahrscheinlich nicht alle Spalten von player
im Ergebnis auch nicht. Nur SELECT
die Spalten, die Sie wirklich brauchen.
Die PK auf player
stellt den Index bereit, den Sie für diese Tabelle benötigen.
Sie benötigen einen Index für playersinclubs(club_id, player_id)
, aber nicht Machen Sie es einzigartig, es sei denn, Spieler dürfen demselben Club kein zweites Mal beitreten.
Wenn Spieler mehrmals beitreten können und Sie nur eine Liste mit "allen Spielern" haben möchten, müssen Sie auch einen DISTINCT
hinzufügen Schritt, um doppelte Einträge zu falten. Sie könnten einfach:
SELECT DISTINCT p.* ...
Aber da Sie versuchen, die Leistung zu optimieren:Es ist billiger, Dupes frühzeitig zu beseitigen:
SELECT p.*
FROM (
SELECT DISTINCT player_id
FROM playersinclubs
WHERE club_id = 3;
) pc
JOIN player p ON p.id = pc.player_id;
Vielleicht möchten Sie wirklich alles Einträge in playersinclubs
und auch alle Spalten der Tabelle. Aber deine Beschreibung sagt etwas anderes. Abfrage und Indizes wären unterschiedlich.
Eng verwandte Antwort: