sql >> Databasteknik >  >> RDS >> Mysql

I MySQL, ökar prestanda att sätta SELECT foo om foo indexeras?

Det första du bör vara medveten om är att MySQL endast använder ett index per psuedo-SELECT (inte uttalande) - när du ser utdata från SELECT med EXPLAIN, ser du vilket index som valdes per. EXPLAIN kan bara köras på SELECTS, så vi måste anta att en DELETE/UPDATE använder samma plan när du byter ut syntaxen mot SELECT...

De flesta databaser (inbäddade kan vara udda) såvitt jag vet stöder användningen av index i följande klausuler:

  • VÄLJ
  • GÅ MED (ANSI-92-syntax)
  • VAR (eftersom det finns både ANSI-89 och filtrering här)
  • HAVING (WHERE ekvivalent, men till skillnad från WHERE - tillåter aggregerad användning utan att behöva undersöka)
  • BESTÄLL AV

Jag är inte 100 % på GROUP BY, så jag utelämnar det för tillfället.

I slutändan är det optimerarens val för vad som ska användas baserat på dess algoritm och den statistik den har till hands. Du kan använda ANALYSERA TABELL-syntaxen för att uppdatera statistiken (regelbundet, inte ständigt tack).

Tillägg

MySQL begränsar också mängden utrymme för att allokera index - 1 000 byte för MyISAM-tabeller och 767 byte för InnoDB-tabeller . Eftersom MySQL bara använder ett index per psuedo-SELECT, är det en bra idé att täcka index (index som innehåller mer än en kolumn), men det gäller verkligen att testa den vanligaste frågan och optimera för den så gott det går. Indexeringsprioriteten bör vara:

  1. Primärnyckel (någonstans i v5 blev indexskapandet för pk automatiskt)
  2. Främmande nycklar (nästa mest troliga JOIN-kandidat
  3. Filtreringskriterier (förutsatt att du har utrymmet)


  1. Modellera PostgreSQL:s stora objekt i Rails

  2. Hur man döljer MySQL Connection String- Användarnamn och lösenord på GitHub (Java)

  3. Hur kan jag stoppa exekveringen av sql-frågor i php?

  4. Oracle/SQL - Kombinera räkningar från "orelaterade" orelaterade tabeller