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

mysql:výběr nejúčinnějšího dotazu ze dvou

Není pochyb o tom, že verze 1 – samostatná, kde jsou klauzule na každé straně unie – bude rychlejší. Podívejme se, proč je verze – kde klauzule nad výsledkem unie – horší:

  • objem dat:ve výsledku sjednocení bude vždy více řádků, protože existuje méně podmínek pro to, jaké řádky se vrátí. To znamená více diskových I/O (v závislosti na indexech), více dočasného úložiště pro uložení sady řádků, což znamená delší dobu zpracování
  • opakované skenování:celý výsledek sjednocení musí být znovu prohledán, aby se uplatnila podmínka, kdy mohl být zpracován během počátečního skenování. To znamená dvojitou manipulaci se sadou řádků, i když pravděpodobně v paměti, přesto je to práce navíc.
  • indexy se nepoužívají pro klauzule where ve výsledku sjednocení. Pokud máte index přes pole cizího klíče a postType, nebude použit

Pokud chcete maximální výkon, použijte UNION ALL , který předává řádky přímo do výsledku bez režie, namísto UNION , který odstraňuje duplikáty (obvykle řazením) a může být drahý a je zbytečný na základě vašich komentářů

Definujte tyto indexy a použijte verzi 1 pro maximální výkon:

create index t1_authorID_postType on t1(authorID, postType);
create index t1_websiteID_postType on t1(websiteID, postType);


  1. Je bezpečné ukládat data jako řetězec v mysql?

  2. Jak nastavit název tabulky v dynamickém SQL dotazu?

  3. Proč je potřeba putenv() na již definované proměnné prostředí?

  4. Přesunutí řádku z jedné tabulky do druhé (seznam pro vložení hodnot neodpovídá seznamu sloupců)