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:
- Ile wierszy znajduje się w
playlist_program_map
i ileDISTINCT playlist_id
są wartości?- Ile wierszy jest w
programs
i ileDISTINCT submitter_id, feed_id
są pary?
- Ile wierszy jest w
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.