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

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, on-line

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.)
5.6.2013 07:07:52

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
5.6.2013 10:24:00

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
15.6.2013 12:28:24

ikona Jakub Vrána:

Přidám to pro ostatní databázové systémy. Pro MySQL ne.
17.6.2013 08:38:54

ikona Jakub Vrána:

Přidal jsem to.
26.6.2013 05:04:37

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
12.6.2013 18:02:45
avatar © 2005-2024 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.