sql >> Database >  >> RDS >> Mysql

Cache/Hergebruik een subquery in MySQL

Bekijk wat EXPLAIN EXTENDED zegt.

Als er DEPENDENT SUBQUERY . staat of UNCACHEABLE SUBQUERY , dan wordt het elke keer dat het wordt gebruikt opnieuw beoordeeld.

Dit gebeurt als de subquery sessievariabelen gebruikt of een gecorreleerde subquery is.

Als dit niet het geval is, wordt het hoogstwaarschijnlijk in de cache opgeslagen.

Als in uw geval de subquery niet in de cache wordt opgeslagen, wordt deze opnieuw beoordeeld in elke UNION klaar.

Je subquery lijkt echter te ingewikkeld. Waarom gebruik je niet gewoon:

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

Als je een index hebt op playlist_program_map (playlist_id) , zou deze zoekopdracht als een zonnetje moeten werken.

Kun je me nog twee dingen vertellen:

  1. Hoeveel rijen zijn er in playlist_program_map en hoeveel DISTINCT playlist_id waarden zijn er?
    • Hoeveel rijen zijn er in programs en hoeveel DISTINCT submitter_id, feed_id zijn er paren?

Uit je reactie kan ik opmaken dat er 10 . zijn programs per playlist gemiddeld, en 200 programs per (submitter, feed) paar. Dit betekent uw index op playlist_program_map is selectiever dan die op (submitter, feed) , en playlist_program_map moet leidend zijn in de join.

De fulltext index lijkt in jouw geval ook niet erg selectief, aangezien je lid moet worden van 10 programma's van 2.000.000 .

U kunt het volgende beter proberen:

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'

en herhaal dit voor alle drie de tabellen.



  1. Wat is het MySQL-equivalent van STUFF() in SQL Server?

  2. Verbinding maken met een OracleDB via een Android-app

  3. Kan geen verbinding maken met lokale MySQL-server via socket '/var/mysql/mysql.sock' (38)

  4. Bool-waarde instellen in SQL