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_mapen hoeveelDISTINCT playlist_idwaarden zijn er?- Hoeveel rijen zijn er in
programsen hoeveelDISTINCT submitter_id, feed_idzijn 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.