sql >> Databasteknik >  >> RDS >> Mysql

Cache/återanvänd en underfråga i MySQL

Se vad EXPLAIN EXTENDED säger.

Om det står DEPENDENT SUBQUERY eller UNCACHEABLE SUBQUERY , sedan kommer den att omvärderas varje gång den används.

Detta händer om underfrågan använder sessionsvariabler eller är en korrelerad underfråga.

Om det inte gör det kommer det troligen att cachelagras.

Om ditt fall underfrågan inte kommer att cachelagras, kommer den att omvärderas i varje UNION 'ed set.

Din underfråga verkar dock vara för komplicerad. Varför använder du inte bara:

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

Om du har ett index på playlist_program_map (playlist_id) , den här frågan borde fungera som en charm.

Kan du snälla berätta två saker till:

  1. Hur många rader finns det i playlist_program_map och hur många DISTINCT playlist_id finns det värderingar?
    • Hur många rader finns det i programs och hur många DISTINCT submitter_id, feed_id finns det par?

Av din kommentar kan jag dra slutsatsen att det finns 10 programs per playlist i genomsnitt och 200 programs per (submitter, feed) par. Detta betyder ditt index på playlist_program_map är mer selektiv än den på (submitter, feed) och playlist_program_map måste leda i sammanfogningen.

Fulltextindexet i ditt fall verkar inte heller vara särskilt selektivt, med tanke på att du behöver gå med i 10 program av 2 000 000 .

Du kan bättre prova följande:

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'

, och upprepa detta för alla tre tabellerna.



  1. SQL DROP DATABASE Syntax – Listad av DBMS

  2. Är denna fråga säker från sql-injektion?

  3. PHP/MySQL Ordna efter kolumn i en annan tabell

  4. Generera n rader med NULL i PostgreSQL