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 a
vytvořte index(a)
. - Pro dotazy
GROUP BY a
vytvořte index(a)
. - Pro dotazy
WHERE a = ? AND b = ?
vytvořte index(a, b)
nebo(b, a)
. - Pro dotazy
ORDER BY a, b
vytvořte index(a, b)
. - Pro dotazy
WHERE a = ? ORDER BY b
vytvoř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.
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.

