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

MySQL:Proč 5. ID v klauzuli IN drasticky mění plán dotazů?

Jak jste ukázali, MySQL má dva alternativní plány dotazů pro dotazy s ORDER BY ... LIMIT n :

  1. Přečtěte si všechny způsobilé řádky, seřaďte je a vyberte n horní řádky.
  2. Přečtěte si řádky v seřazeném pořadí a zastavte se, když n byly nalezeny kvalifikační řádky.

Aby mohl optimalizátor rozhodnout, která možnost je lepší, musí odhadnout efekt filtrování vaší podmínky WHERE. To není přímočaré, zejména pro sloupce, které nejsou indexovány, nebo pro sloupce, kde jsou hodnoty korelovány. Ve vašem případě je pravděpodobně nutné přečíst mnohem více tabulky v seřazeném pořadí, aby bylo možné najít prvních 25 kvalifikačních řádků, než očekával optimalizátor.

Došlo k několika vylepšením ve způsobu zpracování dotazů LIMIT, a to jak v pozdějších verzích 5.6 (používáte verzi před GA!), tak v novějších verzích (5.7, 8.0). Navrhuji, abyste zkusili upgradovat na novější verzi a zjistili, zda je to stále problém.

Obecně platí, že pokud chcete pochopit rozhodnutí plánovače dotazů, měli byste se podívat na trasování optimalizátoru pro dotaz.



  1. Nelze obnovit zálohu MYSQL do nové databáze

  2. Rámec Apache Spark Job Run!

  3. Jak použít název proměnné v příkazu SQL?

  4. Vytvořte vztah v SQL