Най-важното е, че имате нужда от индекс на playersinclubs(club_id, player_id)
. Останалото са подробности (които все още могат да имат голямо значение).
Трябва да сте точни относно действителните си цели. Вие пишете:
Не е необходимо да се присъединявате към club
за това изобщо:
SELECT p.*
FROM playersinclubs pc
JOIN player p ON p.id = pc.player_id
WHERE pc.club_id = 3;
И нямате нужда от колони playersinclubs
в изхода, което е малка печалба за производителността - освен ако не позволява само индекс сканиране в playersinclubs
, тогава може да е значително.
Вероятно нямате нужда от всички колони на player
в резултата също. Само SELECT
колоните, от които всъщност се нуждаете.
PK на player
осигурява индекса, от който се нуждаете в тази таблица.
Имате нужда от индекс на playersinclubs(club_id, player_id)
, но направите направи го уникален, освен ако на играчите не е позволено да се присъединят към същия клуб втори път.
Ако играчите могат да се присъединят няколко пъти и вие просто искате списък с „всички играчи“, трябва също да добавите DISTINCT
стъпка за сгъване на дублирани записи. Бихте могли просто:
SELECT DISTINCT p.* ...
Но тъй като се опитвате да оптимизирате производителността:по-евтино е да премахнете измамите рано:
SELECT p.*
FROM (
SELECT DISTINCT player_id
FROM playersinclubs
WHERE club_id = 3;
) pc
JOIN player p ON p.id = pc.player_id;
Може би наистина искате всичко записи в playersinclubs
и всички колони на таблицата също. Но вашето описание казва друго. Заявката и индексите биха били различни.
Тясно свързан отговор: