Mais importante, você precisa de um índice em
playersinclubs(club_id, player_id)
. O resto são detalhes (que ainda podem fazer muita diferença).Você precisa ser preciso sobre seus objetivos reais. Você escreve:
Você não precisa se associar ao
club
para tudo isso:SELECT p.*
FROM playersinclubs pc
JOIN player p ON p.id = pc.player_id
WHERE pc.club_id = 3;
E você não precisa de colunas
playersinclubs
na saída, o que é um pequeno ganho de desempenho - a menos que permita um índice somente escaneie em playersinclubs
, então pode ser substancial. Você provavelmente não precisa de todos colunas de
player
no resultado também. Apenas SELECT
as colunas que você realmente precisa. O PK no
player
fornece o índice que você precisa nessa tabela. Você precisa de um índice em
playersinclubs(club_id, player_id)
, mas não torná-lo único, a menos que os jogadores não possam ingressar no mesmo clube uma segunda vez. Se os jogadores puderem entrar várias vezes e você quiser apenas uma lista de "todos os jogadores", você também precisará adicionar um
DISTINCT
passo para dobrar entradas duplicadas. Você poderia apenas:SELECT DISTINCT p.* ...
Mas como você está tentando otimizar o desempenho:é mais barato eliminar dupes cedo:
SELECT p.*
FROM (
SELECT DISTINCT player_id
FROM playersinclubs
WHERE club_id = 3;
) pc
JOIN player p ON p.id = pc.player_id;
Talvez você realmente queira todos entradas em
playersinclubs
e todas as colunas da tabela também. Mas sua descrição diz o contrário. Consulta e índices seriam diferentes. Resposta intimamente relacionada: