Ver lo que EXPLAIN EXTENDED dice.
Si dice DEPENDENT SUBQUERY o UNCACHEABLE SUBQUERY , luego se volverá a evaluar cada vez que se use.
Esto sucede si la subconsulta usa variables de sesión o es una subconsulta correlacionada.
Si no es así, lo más probable es que se almacene en caché.
Si su caso, la subconsulta no se almacenará en caché, se reevaluará en cada UNION 'ed conjunto.
Sin embargo, su subconsulta parece ser demasiado complicada. ¿Por qué no usas simplemente:
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
Si tiene un índice en playlist_program_map (playlist_id) , esta consulta debería funcionar a las mil maravillas.
¿Podría decirme dos cosas más?:
- ¿Cuántas filas hay en
playlist_program_map? y cuántosDISTINCT playlist_idvalores hay?- ¿Cuántas filas hay en
programs? y cuántosDISTINCT submitter_id, feed_idpares hay?
- ¿Cuántas filas hay en
De tu comentario puedo concluir que hay 10 programs por playlist en promedio, y 200 programs por (submitter, feed) par. Esto significa su índice en playlist_program_map es más selectivo que el de (submitter, feed) y playlist_program_map debe estar al frente en la unión.
El índice de texto completo en su caso tampoco parece ser muy selectivo, dado que debe unirse a 10 programas de 2,000,000 .
Es mejor que pruebes lo siguiente:
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'
y repita esto para las tres tablas.