sql >> Databáze >  >> RDS >> PostgreSQL

Tabulka Many to Many – Výkon je špatný

A co je nejdůležitější, potřebujete index na playersinclubs(club_id, player_id) . Zbytek jsou detaily (které mohou stále znamenat značný rozdíl).
Musíte být přesní ve svých skutečných cílech. Píšete:

Nemusíte se připojovat do club za tohle vůbec:

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

A nepotřebujete sloupce playersinclubs buď ve výstupu, což je malý zisk pro výkon – pokud to neumožňuje pouze index skenujte na playersinclubs , pak to může být podstatné.

Pravděpodobně nepotřebujete vše sloupce player ve výsledku buď. Pouze SELECT sloupce, které skutečně potřebujete.

PK v player poskytuje index, který na této tabulce potřebujete.

Potřebujete index na playersinclubs(club_id, player_id) , ale ne aby byl jedinečný, pokud hráčům nebude dovoleno vstoupit do stejného klubu podruhé.

Pokud se hráči mohou připojit vícekrát a chcete pouze seznam "všech hráčů", musíte také přidat DISTINCT krok ke skládání duplicitních záznamů. Můžete jen:

SELECT DISTINCT p.* ...

Ale protože se snažíte optimalizovat výkon:je levnější eliminovat podvody včas:

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

Možná opravdu chcete vše záznamy v playersinclubs a také všechny sloupce tabulky. Ale tvůj popis říká něco jiného. Dotaz a indexy by byly jiné.

Úzce související odpověď:



  1. Nelze se připojit k dokovacímu kontejneru Postgres z kontejneru Golang

  2. PHP / PDO:SQl pro nalezení řádku, který obsahuje hodnotu řetězce

  3. Přístup ke konkrétní tabulce v html značce

  4. Existují nějaká úskalí / věci, které potřebujete vědět při přechodu z MyISAM na InnoDB