PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Many-to-Many-Tabelle - Die Leistung ist schlecht

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: