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_map
a kolikDISTINCT playlist_id
jsou tam hodnoty?- Kolik řádků je v
programs
a kolikDISTINCT submitter_id, feed_id
jsou 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.