Вижте какво 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) , тази заявка трябва да работи като чар.
Бихте ли ми казали още две неща:
- Колко реда има в
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'
и повторете това за трите таблици.