Podívejte se, co EXPLAIN EXTENDED říká.
Pokud to říká DEPENDENT SUBQUERY nebo UNCACHEABLE SUBQUERY , pak bude znovu vyhodnocena při každém použití.
K tomu dochází, pokud poddotaz používá proměnné relace nebo jde o korelovaný poddotaz.
Pokud ne, bude s největší pravděpodobností uložen do mezipaměti.
Pokud ve vašem případě nebude poddotaz uložen do mezipaměti, bude znovu vyhodnocen v každém UNION ed set.
Váš dílčí dotaz se však zdá být příliš komplikovaný. Proč prostě nepoužiješ:
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
Pokud máte index na playlist_program_map (playlist_id) , tento dotaz by měl fungovat jako kouzlo.
Můžete mi prosím říct ještě dvě věci:
- Kolik řádků je v
playlist_program_mapa kolikDISTINCT playlist_idjsou tam hodnoty?- Kolik řádků je v
programsa kolikDISTINCT submitter_id, feed_idjsou tam páry?
- Kolik řádků je v
Z vašeho komentáře mohu usoudit, že jich je 10 programs podle playlist v průměru a 200 programs za (submitter, feed) pár. To znamená, že váš index na playlist_program_map je selektivnější než ten na (submitter, feed) a playlist_program_map musí být vedoucí ve spojení.
Fulltextový index se ve vašem případě také nezdá být příliš selektivní, vzhledem k tomu, že se musíte připojit k 10 programy z 2 000 000 .
Můžete raději zkusit následující:
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'
a opakujte to pro všechny tři tabulky.