Sehen Sie, was EXPLAIN EXTENDED ist sagt.
Wenn dort DEPENDENT SUBQUERY steht oder UNCACHEABLE SUBQUERY , dann wird es jedes Mal neu bewertet, wenn es verwendet wird.
Dies geschieht, wenn die Unterabfrage Sitzungsvariablen verwendet oder eine korrelierte Unterabfrage ist.
Wenn dies nicht der Fall ist, wird es höchstwahrscheinlich zwischengespeichert.
Wenn die Unterabfrage in Ihrem Fall nicht zwischengespeichert wird, wird sie in jeder UNION neu ausgewertet eingestellt.
Ihre Unterabfrage scheint jedoch zu kompliziert zu sein. Warum verwenden Sie nicht einfach:
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
Wenn Sie einen Index auf playlist_program_map (playlist_id) haben , diese Abfrage sollte wie ein Zauber wirken.
Könnten Sie mir bitte zwei weitere Dinge sagen:
- Wie viele Zeilen gibt es in
playlist_program_mapund wie vieleDISTINCT playlist_idWerte sind da?- Wie viele Zeilen gibt es in
programsund wie vieleDISTINCT submitter_id, feed_idPaare gibt es?
- Wie viele Zeilen gibt es in
Aus Ihrem Kommentar kann ich schließen, dass es 10 gibt programs pro playlist im Durchschnitt und 200 programs pro (submitter, feed) Paar. Das bedeutet Ihren Index auf playlist_program_map ist selektiver als die auf (submitter, feed) und playlist_program_map muss im Join führend sein.
Der Volltextindex scheint in Ihrem Fall auch nicht sehr selektiv zu sein, da Sie 10 beitreten müssen Programme von 2.000.000 .
Sie können besser Folgendes versuchen:
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'
, und wiederholen Sie dies für alle drei Tabellen.