Jak psát kód: Databázové indexy vytvářejte při psaní dotazů

Školení, která pořádám

Databázový index je pomocná struktura, pomocí které se dá rychle vyhledávat (obvykle v čase O(log N)) a třídit (obvykle O(N)). Některé indexy se dají navrhnout už při vytváření tabulky (primární, unikátní a cizí klíče), ostatní byste měli navrhnout podle toho, jaké dotazy kladete. Základní pravidla jsou tato:

Index dramaticky zrychluje čtení a mírně zpomaluje zápis, takže byste ho měli vytvořit vždy, když tabulka bude mít víc než pár desítek řádek a bude se z ní převážně číst. Když index nevytvoříte hned, tak si žádné pomalosti nemusíte všimnout, protože objem dat v tabulce může být ze začátku malý.

Přijďte si o tomto tématu popovídat na školení Návrh a používání MySQL databáze.

Jakub Vrána, Dobře míněné rady, 5.6.2013, diskuse: 6 (nové: 0)

Diskuse

MaReK Olšavský:

Asi by bylo žádoucí doplnit, že je potřebné naučit se rozumět EXPLAINu. Sice je pracné ověřit používané SQL příkazy, ale rozhodně se vyplatí indexaci vyladit. Podle potřeby používat [ASC|DESC] intexy a rozhodně se nebát sestavit jeden složitý dotaz místo sekvenčního kladení dotazů v cyklu. (Podle mě je takový ZenCart krásným příkladem toho, jak nepracovat s SQL.)

Antonín Faltýnek:

Určitě je nutné věnovat EXPLAIN pozornost. Na školení je na něj kladen velký důraz a obsahuje řadu příkladů, které práci s EXPLAIN vysvětlují tak,Dobrý den, přesně tak aby jsme

Stanislav:

Ono třeba MySQL od verze 5.6 alespoň parsuje ASC/DESC u indexů, ale pořád uchovává jen ASC. Snad v příštích verzích doplní tuhle základní věc.

To je možná i prosba na Jakuba, jestli neplánuje v Admineru přidat výběr ASC/DESC u tvorby index.

"An index_col_name specification can end with ASC or DESC. These keywords are permitted for future extensions for specifying ascending or descending index value storage. Currently, they are parsed but ignored; index values are always stored in ascending order."
- http://dev.mysql.com/doc/refman/5.6/en/create-index.html

ikona Jakub Vrána OpenID:

Přidám to pro ostatní databázové systémy. Pro MySQL ne.

ikona Jakub Vrána OpenID:

Přidal jsem to.

Vojtěch Semecký:

V případě MySQL bych ještě, pro odhalení špatně navržených indexů/dotazů, doporučil Slow Query Log: http://dev.mysql.com/doc/refman/5.1/en/slow-query-log.html

Vložit příspěvek

Používejte diakritiku. Vstup se chápe jako čistý text, ale URL budou převedeny na odkazy a PHP kód uzavřený do <?php ?> bude zvýrazněn. Pokud máte dotaz, který nesouvisí s článkem, zkuste raději diskusi o PHP, zde se odpovědi pravděpodobně nedočkáte.

Jméno: URL:

avatar © 2005-2016 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.