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_map
och hur mångaDISTINCT playlist_id
finns det värderingar?- Hur många rader finns det i
programs
och hur mångaDISTINCT submitter_id, feed_id
finns 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.