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ěď: