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:
- 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
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
Diskuse je zrušena z důvodu spamu.