Se hvad EXPLAIN EXTENDED siger.
Hvis der står DEPENDENT SUBQUERY eller UNCACHEABLE SUBQUERY , så vil den blive revurderet hver gang den bruges.
Dette sker, hvis underforespørgslen bruger sessionsvariable eller er en korreleret underforespørgsel.
Hvis den ikke gør det, vil den højst sandsynligt blive cachelagret.
Hvis din sag underforespørgslen ikke bliver cachelagret, vil den blive revurderet i hver UNION 'ed sæt.
Din underforespørgsel ser dog ud til at være for kompliceret. Hvorfor bruger du ikke bare:
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
Hvis du har et indeks på playlist_program_map (playlist_id) , bør denne forespørgsel fungere som en charme.
Kan du venligst fortælle mig to ting mere:
- Hvor mange rækker er der i
playlist_program_mapog hvor mangeDISTINCT playlist_ider der værdier?- Hvor mange rækker er der i
programsog hvor mangeDISTINCT submitter_id, feed_ider der par?
- Hvor mange rækker er der i
Ud fra din kommentar kan jeg konkludere, at der er 10 programs pr. playlist i gennemsnit og 200 programs pr. (submitter, feed) par. Dette betyder dit indeks på playlist_program_map er mere selektiv end den på (submitter, feed) og playlist_program_map skal være førende i sammenføjningen.
Fuldtekstindekset i dit tilfælde ser heller ikke ud til at være særlig selektivt, da du skal deltage i 10 programmer ud af 2.000.000 .
Du kan hellere prøve følgende:
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'
, og gentag dette for alle tre tabeller.