Veja o que
EXPLAIN EXTENDED
diz. Se estiver escrito
DEPENDENT SUBQUERY
ou UNCACHEABLE SUBQUERY
, ele será reavaliado cada vez que for usado. Isso acontece se a subconsulta usar variáveis de sessão ou for uma subconsulta correlacionada.
Se isso não acontecer, provavelmente será armazenado em cache.
Se no seu caso a subconsulta não for armazenada em cache, ela será reavaliada em cada
UNION
foi definido. Sua subconsulta, no entanto, parece ser muito complicada. Por que você simplesmente não usa:
SELECT id
FROM playlist_program_map ppm, programs p
WHERE ppm.playlist_id = 181
AND p.id = ppm.program_id
AND submitter_id = 32
AND feed_id = 2478
Se você tiver um índice em
playlist_program_map (playlist_id)
, essa consulta deve funcionar como um encanto. Você poderia me dizer mais duas coisas:
- Quantas linhas existem em
playlist_program_map
e quantosDISTINCT playlist_id
valores existem?- Quantas linhas existem em
programs
e quantosDISTINCT submitter_id, feed_id
pares existem?
- Quantas linhas existem em
Pelo seu comentário, posso concluir que existem 10
programs
por playlist
em média, e 200 programs
por (submitter, feed)
par. Isso significa que seu índice em playlist_program_map
é mais seletivo que o de (submitter, feed)
e playlist_program_map
deve estar liderando na junção. O índice de texto completo no seu caso também não parece ser muito seletivo, já que você precisa juntar 10 programas de 2.000.000 .
Você pode tentar melhor o seguinte:
SELECT object_id, programs.created AS created
FROM playlist_program_map ppm, programs p, comments_programs cp
WHERE ppm.playlist_id = 181
AND p.id = ppm.program_id
AND p.submitter_id = 32
AND p.feed_id = 2478
AND cp.object_id = p.id
AND cp.text REGEXP 'excellent'
e repita isso para todas as três tabelas.