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