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_map
og hvor mangeDISTINCT playlist_id
er der værdier?- Hvor mange rækker er der i
programs
og hvor mangeDISTINCT submitter_id, feed_id
er 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.