sql >> Database teknologi >  >> RDS >> Mysql

Øger det i MySQL at sætte SELECT foo i ydeevne, hvis foo er indekseret?

Det første du skal være opmærksom på er, at MySQL kun bruger et indeks pr. psuedo-SELECT (ikke sætning) - når du ser output af SELECT'et ved hjælp af EXPLAIN, vil du se, hvilket indeks der blev valgt pr. EXPLAIN kan kun køres på SELECTS, så vi må antage, at en DELETE/UPDATE bruger den samme plan, når du udskifter syntaksen med SELECT...

De fleste databaser (indlejrede kan være mærkelige) så vidt jeg ved understøtter brugen af ​​indekser i følgende klausuler:

  • VÆLG
  • JOIN (ANSI-92-syntaks)
  • HVOR (fordi der er både ANSI-89 og filtrering her)
  • HAVING (WHERE ækvivalent, men i modsætning til WHERE - tillader samlet brug uden behov for underforespørgsel)
  • BEstil efter

Jeg er ikke 100 % på GROUP BY, så jeg udelader det foreløbig.

I sidste ende er det optimerernes valg for, hvad de skal bruge baseret på dens algoritme og den statistik, den har ved hånden. Du kan bruge ANALYSE TABEL-syntaksen for at opdatere statistikken (periodisk, ikke konstant venligst).

Tillæg

MySQL begrænser også mængden af ​​plads til tildeling af indekser - 1.000 bytes til MyISAM-tabeller og 767 bytes til InnoDB-tabeller . På grund af at MySQL kun bruger ét indeks pr. psuedo-SELECT, er det en god idé at dække indekser (indekser, der inkluderer mere end én kolonne), men det handler virkelig om at teste den mest almindelige forespørgsel og optimere den så godt du kan. Indekseringsprioriteten bør være:

  1. Primær nøgle (et sted i v5 blev indeksoprettelse for pk automatisk)
  2. Fremmednøgler (den næste mest sandsynlige JOIN-kandidat
  3. Filtreringskriterier (forudsat at du har pladsen)


  1. Kan ikke åbne SQLite-database fra SQLIte Helper Oncreate, når OnCreate udløses ved at åbne databasen for første gang

  2. Sådan SQL Vælg en en til mange relation og flet outputtet

  3. Tilføj et procenttegn til et tal i MariaDB

  4. I stedet for trigger i SQL Server mister SCOPE_IDENTITY?