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

Zvyšuje v MySQL uvedení SELECT foo výkon, pokud je foo indexováno?

První věc, kterou je třeba si uvědomit, je, že MySQL používá pouze jeden index na pseudo-SELECT (nikoli příkaz) – když si prohlížíte výstup SELECT pomocí EXPLAIN, uvidíte, který index byl vybrán. EXPLAIN lze spustit pouze na SELECTS, takže musíme předpokládat, že DELETE/UPDATE používá stejný plán, když vyměníte syntaxi pro SELECT...

Většina databází (vestavěné mohou být liché) podle mých znalostí podporuje použití indexů v následujících klauzulích:

  • VYBRAT
  • JOIN (syntaxe ANSI-92)
  • KDE (protože existuje ANSI-89 a filtrace zde)
  • HAVING (WHERE ekvivalentní, ale na rozdíl od WHERE – umožňuje agregované použití bez nutnosti poddotazu)
  • OBJEDNEJTE PODLE

Nejsem 100% na GROUP BY, takže to prozatím vynechávám.

Nakonec je to volba optimalizátorů pro to, co použít, na základě jeho algoritmu a statistik, které má po ruce. Můžete použít syntaxi ANALYZE TABLE pro obnovení statistik (pravidelně, ne neustále).

Dodatek

MySQL také omezuje množství prostoru pro alokaci indexů – 1 000 bajtů pro tabulky MyISAM a 767 bajtů pro tabulky InnoDB . Vzhledem k tomu, že MySQL používá pouze jeden index na psuedo-SELECT, pokrývání indexů (indexy, které obsahují více než jeden sloupec) je dobrý nápad, ale ve skutečnosti jde o testování nejběžnějšího dotazu a jeho co nejlepší optimalizaci. Priorita indexování by měla být:

  1. Primární klíč (někde ve verzi 5 se vytváření indexu pro pk stalo automatickým)
  2. Cizí klíče (další nejpravděpodobnější kandidát JOIN
  3. Kritéria filtrování (za předpokladu, že máte prostor)


  1. Tabulka mutuje, spouštěč/funkce to nemusí vidět (zabrání poklesu průměrné známky pod 2,5)

  2. PostgreSQL:Který datový typ by měl být použit pro měnu?

  3. Rozbalte na OracleConnection

  4. Proč je STAV SHOW TABLE STATUS innodb tak nespolehlivý?