Вижте какво 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'
и повторете това за трите таблици.