sql >> Databasteknik >  >> RDS >> PostgreSQL

Många till många bord - Prestanda är dålig

Viktigast av allt, du behöver ett index på playersinclubs(club_id, player_id) . Resten är detaljer (som fortfarande kan göra stor skillnad).
Du måste vara exakt om dina faktiska mål. Du skriver:

Du behöver inte gå med i club för detta överhuvudtaget:

SELECT p.* 
FROM   playersinclubs pc
JOIN   player         p ON p.id = pc.player_id
WHERE  pc.club_id = 3;

Och du behöver inte kolumner playersinclubs i utgången antingen, vilket är en liten vinst för prestanda - om det inte tillåter en endast index skanna på playersinclubs , då kan det vara betydande.

Du behöver förmodligen inte alla kolumner för player i resultatet heller. Endast SELECT kolumnerna du faktiskt behöver.

PK på player tillhandahåller indexet du behöver på den tabellen.

Du behöver ett index på playersinclubs(club_id, player_id) , men gör inte göra det unikt om inte spelare inte får gå med i samma klubb en andra gång.

Om spelare kan gå med flera gånger och du bara vill ha en lista över "alla spelare", måste du också lägga till en DISTINCT steg för att vika dubblettposter. Du kan bara:

SELECT DISTINCT p.* ...

Men eftersom du försöker optimera prestanda:det är billigare att eliminera duperingar tidigt:

SELECT p.*
FROM  (
   SELECT DISTINCT player_id
   FROM   playersinclubs
   WHERE  club_id = 3;
   ) pc
JOIN   player p ON p.id = pc.player_id;

Kanske vill du verkligen ha allt inlägg i playersinclubs och alla kolumner i tabellen också. Men din beskrivning säger något annat. Fråga och index skulle vara annorlunda.

Närbesläktat svar:



  1. Använder unaccent med SearchVector och SearchQuery i Django

  2. Maven - java.lang.ClassNotFoundException:com.mysql.jdbc.Driver

  3. Slick dynamisk gruppbyte

  4. Metoden org.postgresql.jdbc4.Jdbc4Connection.isValid(int) är ännu inte implementerad