Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Pamięć podręczna/ponowne użycie podzapytania w MySQL

Zobacz, co EXPLAIN EXTENDED mówi.

Jeśli jest napisane DEPENDENT SUBQUERY lub UNCACHEABLE SUBQUERY , będzie on ponownie oceniany za każdym razem, gdy zostanie użyty.

Dzieje się tak, jeśli podzapytanie używa zmiennych sesji lub jest skorelowanym podzapytaniem.

Jeśli tak się nie stanie, najprawdopodobniej zostanie zapisane w pamięci podręcznej.

Jeśli w Twoim przypadku podzapytanie nie zostanie zapisane w pamięci podręcznej, zostanie ponownie ocenione w każdym UNION ed zestaw.

Twoje podzapytanie wydaje się jednak zbyt skomplikowane. Dlaczego po prostu nie użyjesz:

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

Jeśli masz indeks na playlist_program_map (playlist_id) , to zapytanie powinno działać jak urok.

Czy mógłbyś mi powiedzieć jeszcze dwie rzeczy:

  1. Ile wierszy znajduje się w playlist_program_map i ile DISTINCT playlist_id są wartości?
    • Ile wierszy jest w programs i ile DISTINCT submitter_id, feed_id są pary?

Z Twojego komentarza mogę wywnioskować, że jest 10 programs na playlist średnio i 200 programs na (submitter, feed) para. Oznacza to, że Twój indeks na playlist_program_map jest bardziej selektywny niż ten na (submitter, feed) i playlist_program_map musi być liderem w łączeniu.

Indeks pełnotekstowy w twoim przypadku również nie wydaje się zbyt selektywny, biorąc pod uwagę, że musisz dołączyć do 10 programy z 2 000 000 .

Lepiej wypróbuj następujące rozwiązania:

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'

i powtórz to dla wszystkich trzech tabel.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Funkcja MySQL RADIANS() – Konwersja ze stopni na radiany

  2. Czy mogę użyć wielu instrukcji w przygotowanym zapytaniu JDBC?

  3. Jak zaimplementować ten program do importowania do tabeli bez użycia instrukcji INSERT INTO SELECT?

  4. Wstaw tablicę rekordów do mysql za pomocą Node JS

  5. Jak wyświetlić wszystkie rekordy w bazie danych do JTable?