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:
- Primær nøgle (et sted i v5 blev indeksoprettelse for pk automatisk)
- Fremmednøgler (den næste mest sandsynlige JOIN-kandidat
- Filtreringskriterier (forudsat at du har pladsen)