Se vad EXPLAIN EXTENDED säger.
Om det står DEPENDENT SUBQUERY eller UNCACHEABLE SUBQUERY , sedan kommer den att omvärderas varje gång den används.
Detta händer om underfrågan använder sessionsvariabler eller är en korrelerad underfråga.
Om det inte gör det kommer det troligen att cachelagras.
Om ditt fall underfrågan inte kommer att cachelagras, kommer den att omvärderas i varje UNION 'ed set.
Din underfråga verkar dock vara för komplicerad. Varför använder du inte bara:
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
Om du har ett index på playlist_program_map (playlist_id) , den här frågan borde fungera som en charm.
Kan du snälla berätta två saker till:
- Hur många rader finns det i
playlist_program_mapoch hur mångaDISTINCT playlist_idfinns det värderingar?- Hur många rader finns det i
programsoch hur mångaDISTINCT submitter_id, feed_idfinns det par?
- Hur många rader finns det i
Av din kommentar kan jag dra slutsatsen att det finns 10 programs per playlist i genomsnitt och 200 programs per (submitter, feed) par. Detta betyder ditt index på playlist_program_map är mer selektiv än den på (submitter, feed) och playlist_program_map måste leda i sammanfogningen.
Fulltextindexet i ditt fall verkar inte heller vara särskilt selektivt, med tanke på att du behöver gå med i 10 program av 2 000 000 .
Du kan bättre prova följande:
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'
, och upprepa detta för alla tre tabellerna.