sql >> Databáze >  >> RDS >> Mysql

Indexy MySQL – jaké jsou nejlepší postupy?

Určitě byste měli věnovat nějaký čas čtení indexování, je o něm napsáno hodně a je důležité porozumět tomu, co se děje.

Obecně řečeno, index ukládá řádky tabulky řazení.

Pro jednoduchost si představte, že tabulka je jen velký soubor CSV. Kdykoli je vložen řádek, vloží se na konec . Takže "přirozené" uspořádání tabulky je pouze pořadí, ve kterém byly vloženy řádky.

Představte si, že máte tento soubor CSV načtený ve velmi základní tabulkové aplikaci. Tato tabulka pouze zobrazuje data a čísluje řádky v sekvenčním pořadí.

Nyní si představte, že potřebujete najít všechny řádky, které mají ve třetím sloupci nějakou hodnotu „M“. Vzhledem k tomu, co máte k dispozici, máte pouze jednu možnost. Naskenujete tabulku a zkontrolujete hodnotu třetího sloupce pro každý řádek. Pokud máte mnoho řádků, může tato metoda ("prohledání tabulky") trvat dlouho!

Nyní si představte, že kromě této tabulky máte ještě index. Tento konkrétní index je index hodnot ve třetím sloupci. Index uvádí všechny hodnoty ze třetího sloupce v nějakém smysluplném pořadí (řekněme abecedně) a pro každou z nich poskytuje seznam čísel řádků, kde se tato hodnota vyskytuje.

Nyní máte dobrou strategii pro nalezení všech řádků, kde je hodnota třetího sloupce "M". Můžete například provést binární vyhledávání ! Zatímco skenování tabulky vyžaduje, abyste se podívali na N řádků (kde N je počet řádků), binární vyhledávání vyžaduje pouze to, abyste se v nejhorším případě podívali na položky indexu log-n. Páni, to je jistě mnohem jednodušší!

Samozřejmě, pokud máte tento index a přidáváte do tabulky řádky (na konci, protože tak funguje naše koncepční tabulka), musíte index pokaždé aktualizovat. Takže při psaní nových řádků uděláte trochu více práce, ale ušetříte spoustu času, když něco hledáte.

Obecně tedy indexování vytváří kompromis mezi efektivitou čtení a efektivitou zápisu. Bez indexů může být vkládání velmi rychlé – databázový stroj pouze přidá řádek do tabulky. Při přidávání indexů musí stroj při provádění vkládání aktualizovat každý index.

Na druhou stranu je čtení mnohem rychlejší.

Doufejme, že to pokryje vaše první dvě otázky (jak odpověděli ostatní – musíte najít správnou rovnováhu).

Váš třetí scénář je trochu složitější. Pokud používáte LIKE, indexovací stroje vám obvykle pomohou s rychlostí čtení až do prvních „%“. Jinými slovy, pokud VYBERTE sloupec WHERE LIKE 'foo%bar%', databáze použije index k nalezení všech řádků, kde sloupec začíná "foo", a pak bude muset prohledat tuto mezilehlou sadu řádků, aby našla podmnožinu který obsahuje "bar". SELECT ... WHERE sloupec LIKE '%bar%' nemůže použít index. Doufám, že vidíte proč.

Nakonec musíte začít přemýšlet o indexech na více než jednom sloupci. Koncept je stejný a chová se podobně jako věci LIKE - v podstatě, pokud máte index na (a,b,c), bude engine pokračovat v používání indexu zleva doprava, jak nejlépe může. Takže vyhledávání ve sloupci a může používat index (a,b,c), stejně jako vyhledávání ve sloupci (a,b). Pokud byste však hledali KDE b=5 A c=1), motor by musel provést úplné skenování tabulky.

Doufejme, že to pomůže vrhnout trochu světla, ale musím zopakovat, že nejlepší bude, když strávíte pár hodin hledáním dobrých článků, které tyto věci do hloubky vysvětlují. Je také dobré si přečíst dokumentaci konkrétního databázového serveru. Způsob, jakým jsou indexy implementovány a používány plánovači dotazů, se může značně lišit.



  1. Správa rolí a atributů rolí v PostgreSQL

  2. Jaké jsou některé způsoby přístupu k Microsoft SQL Server z Linuxu?

  3. Konfigurace PostgreSQL pro kontinuitu podnikání

  4. Spusťte všechny soubory SQL v adresáři