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_map
und wie vieleDISTINCT playlist_id
Werte sind da?- Wie viele Zeilen gibt es in
programs
und wie vieleDISTINCT submitter_id, feed_id
Paare 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.