sql >> Databáze >  >> RDS >> Mysql

Cache/Re-use poddotaz v MySQL

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:

  1. Kolik řádků je v playlist_program_map a kolik DISTINCT playlist_id jsou tam hodnoty?
    • Kolik řádků je v programs a kolik DISTINCT submitter_id, feed_id jsou tam páry?

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.



  1. Proč potřebujeme zprostředkovatele zpráv jako RabbitMQ přes databázi jako PostgreSQL?

  2. Jak provést více dotazů mysql společně v PHP?

  3. Jak mohu nastavit výchozí hodnotu sloupce časového razítka na aktuální časové razítko s migrací Laravel?

  4. Naučte se, jak vytvořit PK z Sequence Trigger v SQL Developer