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:
- Pro dotazy
WHERE a = ?vytvořte index(a). - Pro dotazy
ORDER BY avytvořte index(a). - Pro dotazy
GROUP BY avytvořte index(a). - Pro dotazy
WHERE a = ? AND b = ?vytvořte index(a, b)nebo(b, a). - Pro dotazy
ORDER BY a, bvytvořte index(a, b). - Pro dotazy
WHERE a = ? ORDER BY bvytvořte index(a, b). - Pro dotazy
WHERE a = ? OR b = ?vytvořte dva indexy(a)a(b). - Pokud už existuje index
(a, b), tak nevytvářejte index(a), protože jakýkoliv začátek indexu lze použít taky. - Pokud už existuje index
(a)a vy potřebujete(a, b), tak ze stejného důvodu smažte(a)a vytvořte(a, b). - Pokud už existuje index
(a, b)a vy potřebujete(b), tak vytvořte(b), protože konce indexů jsou samy o sobě nepoužitelné.
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
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 jsmeStanislav:
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
Jakub Vrána
:
Přidám to pro ostatní databázové systémy. Pro MySQL ne.
Jakub Vrána
:
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
Diskuse je zrušena z důvodu spamu.

