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_mapi ileDISTINCT playlist_idsą wartości?- Ile wierszy jest w
programsi ileDISTINCT submitter_id, feed_idsą 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.