MySQL 8 EXPLAIN

30. května 2022

Předpokládám, že každý, kdo už někdy řešil problém, proč dotaz v MySQL trvá tak dlouho, zná a používá příkaz EXPLAIN.

Pokud ne, tak ve zkratce příkaz EXPLAIN, mimo jiné, slouží k tomu, aby nám ukázal jak MySQL zpracuje dotaz.

Použiji MySQL shell pro jednoduchou ukázku. Mám databázi vyboh4 s databází pro můj testovací WordPress, prefix mám nastavený na netwp_. První SELECT který WordPress provádí po připojení k databázi je v tomto případě:

SELECT option_name, option_value FROM netwp_options WHERE autoload = 'yes'

Protože výstup není moc přehledný vypíšeme si řádky vertikálně:

Vidíme, že je všechno v pořádku, MySQL použije index ‚autoload‘. Tak mu ten index zrušíme a provedeme znovu EXPLAIN:

Jak je na první pohled vidět, jediný rozdíl je v tom, že se nepoužil index, ale výstup se omezil pomocí WHERE. To nám moc o rychlosti nenapovědělo. EXPLAIN je velmi užitečný nástroj, především pokud provádíte operace nad více tabulkami. Dokumentace k výstupu příkazu EXPLAIN je dostupná na oficiálních stránkách.

Takže proč tohle vůbec píšu? Odpověď je velmi jednoduchá. Od verze MySQL 8.0.18 nás MySQL pustilo nahlédnout pod pokličku plánovače.

Tak se pojďme podívat na EXPLAIN ANALYZE, který nám to umožní.

Stejná databáze, stejný dotaz. Začneme tam kde jsme skončili, máme tabulku bez indexu na poli ‚autoload‘.
Spustíme EXPLAIN ANALYZE, přidáme index ‚autoload‘ a znovu spustíme EXPLAIN ANALYZE.

Takhle to vypadá:

Tak si to pojďme vysvětlit.

EXPLAIN: -> Filter: (netwp_options.autoload = 'yes') (cost=104.95 rows=22) (actual time=0.114..0.860 rows=184 loops=1)
-> Table scan on netwp_options (cost=104.95 rows=221) (actual time=0.109..0.761 rows=227 loops=1)

Pokud nepotřebujete vyladit výkon serveru pro konkrétní aplikaci a například měnit váhy které plánovač přikládá jednotlivým operacím, tak si vystačíme jenom s následujícími údaji: 0.114..0.860 To první číslo je počet milisekund potřebných k nalezení prvního záznamu, to druhé k poslednímu. V druhém řádku je vidět, že MySQL server prošel celou tabulku a je tam ukázáno, kolik ho to stálo.

Po přidání indexu to vypadá takhle:

EXPLAIN: -> Index lookup on netwp_options using autoload (autoload='yes') (cost=37.28 rows=184) (actual time=0.030..0.774 rows=184 loops=1)

0.030..0.774 – je na první pohled vidět, že je to rychlejší a i „cena“ je mnohem nižší a to se bavíme o tabulce s 227 řádky.

Tleskám Oracle za tenhle krok vpřed. Konečně máme v rukách silný nástroj, pro analýzu SQL dotazů.

Ještě link na oficiální dokumentaci EXPLAIN ANYLZE.

Pokud jste zákazníkem CZECHIA.com, naleznete rozhraní pro administraci databáze MySQL na této adrese.

 

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *