Bekijk wat EXPLAIN EXTENDED
zegt.
Als er DEPENDENT SUBQUERY
. staat of UNCACHEABLE SUBQUERY
, dan wordt het elke keer dat het wordt gebruikt opnieuw beoordeeld.
Dit gebeurt als de subquery sessievariabelen gebruikt of een gecorreleerde subquery is.
Als dit niet het geval is, wordt het hoogstwaarschijnlijk in de cache opgeslagen.
Als in uw geval de subquery niet in de cache wordt opgeslagen, wordt deze opnieuw beoordeeld in elke UNION
klaar.
Je subquery lijkt echter te ingewikkeld. Waarom gebruik je niet gewoon:
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
Als je een index hebt op playlist_program_map (playlist_id)
, zou deze zoekopdracht als een zonnetje moeten werken.
Kun je me nog twee dingen vertellen:
- Hoeveel rijen zijn er in
playlist_program_map
en hoeveelDISTINCT playlist_id
waarden zijn er?- Hoeveel rijen zijn er in
programs
en hoeveelDISTINCT submitter_id, feed_id
zijn er paren?
- Hoeveel rijen zijn er in
Uit je reactie kan ik opmaken dat er 10 . zijn programs
per playlist
gemiddeld, en 200 programs
per (submitter, feed)
paar. Dit betekent uw index op playlist_program_map
is selectiever dan die op (submitter, feed)
, en playlist_program_map
moet leidend zijn in de join.
De fulltext index lijkt in jouw geval ook niet erg selectief, aangezien je lid moet worden van 10 programma's van 2.000.000 .
U kunt het volgende beter proberen:
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'
en herhaal dit voor alle drie de tabellen.