Tenho uma consulta com baixo desempenho e não sei onde está o problema. Uma versão bastante reduzida da consulta, que ainda apresenta o mesmo problema, é:
SELECT members.id,
FROM members
LEFT JOIN ( SELECT
member_id,
GROUP_CONCAT(hobby)
FROM member_hobbies
GROUP BY member_id) AS hobbies
ON member.id=hobbies.member_id
Há um índice primário em members.id
e um índice correspondente em hobbies.member_id
.
Se eu remover o GROUP_CONCAT
a consulta será cerca de 50 vezes mais rápida.
Estou ciente de que o exemplo dado acima pode ser simplificado e não requer a subconsulta, e estou tentando simplificar minha consulta completa.
Gostaria de saber se é possível otimizar a consulta em seu formato atual e onde está o problema.
Acredito que o problema de desempenho se deve ao fato de as subconsultas não serem indexadas, o que torna a junção com a subconsulta lenta. Talvez você consiga melhorar isso armazenando os resultados da subconsulta em uma tabela temporária e, em seguida, adicionando um índice a ela.
O motivo da rapidez na remoção
GROUP_CONCAT
é que o planejador de consultas percebe que pode unir diretamente,member_hobbies
em vez de executar a subconsulta, então ele usa omember_id
índice.