Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Zwischenspeichern/Wiederverwenden einer Unterabfrage in MySQL

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:

  1. Wie viele Zeilen gibt es in playlist_program_map und wie viele DISTINCT playlist_id Werte sind da?
    • Wie viele Zeilen gibt es in programs und wie viele DISTINCT submitter_id, feed_id Paare gibt es?

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.