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

DO a DONT pro indexy

Obecně řečeno:

1. Nepřidávejte index, pokud jej skutečně nepotřebujete.

Každý index zpomaluje zápis...

2. Na klauzule where:

bude použit index
-- index on foo (bar)
select bar from foo where bar = :bar;

Stejným způsobem bude použit v odkazech na cizí klíč (v obou tabulkách).

-- index on foo (bar) if baz (bar) is frequently updated/deleted.
create table foo (bar references baz (bar)); 

3. K řazení se použije index, zvláště když je vázán na limit:

-- index on foo (bar)
select bar from foo order by bar limit 10;

4. Vícesloupcové indexy jsou příležitostně užitečné, když platí oba 2. a 3.

V tomto případě uveďte podmínky where na první místo a klíč řazení na konec:

-- index on foo (baz, bar)
select bar from foo where baz between :baz1 and :baz2 group by bar;

5. Udržujte své statistiky tabulky aktuální.

Pokud jsou statistiky tabulky nesmyslné, je malá šance, že optimalizátor použije vaše indexy. V případě potřeby databázi ručně vysajte/analyzujte.

6. Využití indexu závisí na přerozdělení tabulky.

Za určitým prahem načtených řádků bude rychlejší provést úplné prohledání tabulky. Pokud je váš index na booleovském poli, které víceméně rozděluje vaši tabulku na dvě části, nebude nikdy použit.

Podobně, pokud jsou vaše data uložena takovým způsobem, že skenování indexu pravděpodobně skončí náhodným přístupem téměř vždy použitelné stránky disku pro danou tabulku, plánovač upřednostní skenování celé tabulky.

7. Zvažte částečné/výrazové indexy, pokud jsou k dispozici.

Pokud máte pole, které má stejnou hodnotu kromě 10 % vašich řádků, zvažte jeho částečný index (tj. tam, kde tato hodnota není). Výsledkem je mnohem menší index, aniž by to bránilo jeho skutečné užitečnosti.

Pokud se neustále dotazujete na výraz použitý ve vašem sloupci a vaše platforma nabízí indexy výrazů, zvažte přidání indexu. Při použití výraz nebude vyhodnocen pro každý řádek.



  1. Používání rolí Nové v MySQL 8

  2. Přetrvávající UUID v PostgreSQL pomocí JPA

  3. Oracle zkopíruje data do jiné tabulky

  4. Nesprávná neutralizace speciálních prvků použitých v příkazu SQL