Mysql
 sql >> база данни >  >> RDS >> Mysql

Кеш/повторно използване на подзаявка в MySQL

Вижте какво EXPLAIN EXTENDED казва.

Ако пише DEPENDENT SUBQUERY или UNCACHEABLE SUBQUERY , след което ще се преоценява всеки път, когато се използва.

Това се случва, ако подзаявката използва сесийни променливи или е корелирана подзаявка.

Ако не стане, най-вероятно ще се кешира.

Ако вашият случай подзаявката няма да бъде кеширана, тя ще бъде преоценена във всеки UNION 'ed set.

Вашата подзаявка обаче изглежда твърде сложна. Защо просто не използвате:

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

Ако имате индекс на playlist_program_map (playlist_id) , тази заявка трябва да работи като чар.

Бихте ли ми казали още две неща:

  1. Колко реда има в playlist_program_map и колко DISTINCT playlist_id има ли стойности?
    • Колко реда има в programs и колко DISTINCT submitter_id, feed_id има ли двойки?

От коментара ви мога да заключа, че са 10 programs на playlist средно и200 programs на (submitter, feed) двойка. Това означава вашият индекс в playlist_program_map е по-селективен от този на (submitter, feed) и playlist_program_map трябва да е водещ в съединяването.

Индексът на пълен текст във вашия случай също не изглежда много избирателен, като се има предвид, че трябва да се присъедините към 10 програми от 2 000 000 .

Добре е да опитате следното:

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'

и повторете това за трите таблици.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Laravel PDOException грешка в Connector.php ред 55

  2. MySQL Изберете по най-ново времеви печат

  3. MySQL WHERE IN () + AND , PDO връща само един ред

  4. анализирайте резултатите в MySQL чрез REGEX

  5. Какви са оптималните размери на varchar за MySQL?