sql >> Database teknologi >  >> RDS >> Mysql

Cache/genbrug en underforespørgsel i MySQL

Se hvad EXPLAIN EXTENDED siger.

Hvis der står DEPENDENT SUBQUERY eller UNCACHEABLE SUBQUERY , så vil den blive revurderet hver gang den bruges.

Dette sker, hvis underforespørgslen bruger sessionsvariable eller er en korreleret underforespørgsel.

Hvis den ikke gør det, vil den højst sandsynligt blive cachelagret.

Hvis din sag underforespørgslen ikke bliver cachelagret, vil den blive revurderet i hver UNION 'ed sæt.

Din underforespørgsel ser dog ud til at være for kompliceret. Hvorfor bruger du ikke bare:

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

Hvis du har et indeks på playlist_program_map (playlist_id) , bør denne forespørgsel fungere som en charme.

Kan du venligst fortælle mig to ting mere:

  1. Hvor mange rækker er der i playlist_program_map og hvor mange DISTINCT playlist_id er der værdier?
    • Hvor mange rækker er der i programs og hvor mange DISTINCT submitter_id, feed_id er der par?

Ud fra din kommentar kan jeg konkludere, at der er 10 programs pr. playlist i gennemsnit og 200 programs pr. (submitter, feed) par. Dette betyder dit indeks på playlist_program_map er mere selektiv end den på (submitter, feed) og playlist_program_map skal være førende i sammenføjningen.

Fuldtekstindekset i dit tilfælde ser heller ikke ud til at være særlig selektivt, da du skal deltage i 10 programmer ud af 2.000.000 .

Du kan hellere prøve følgende:

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'

, og gentag dette for alle tre tabeller.



  1. Sådan vises tabeller i MySQL og MariaDB

  2. PHP Fatal fejl:Klasse 'PDO' blev ikke fundet

  3. Kontroller codeigniter-forespørgselsfejl i stedet for at vise dem til brugeren

  4. Hvordan udtrækkes kun datoværdi fra datofelt i Oracle?