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

DO'er og DONT'er for indekser

Generelt set:

1. Tilføj ikke et indeks, medmindre du rent faktisk har brug for det.

Hvert indeks gør skrivning langsommere...

2. Et indeks vil blive brugt på where-sætninger:

-- index on foo (bar)
select bar from foo where bar = :bar;

På samme måde vil det blive brugt i fremmednøglereferencer (på begge tabeller).

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

3. Et indeks vil blive brugt til sortering, især når det er bundet til en grænse:

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

4. Indekser med flere kolonner er lejlighedsvis nyttige, når 2. og 3. begge gælder.

I dette tilfælde skal du sætte where-betingelserne først, og sorteringsnøglen sidst:

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

5. Hold din tabelstatistik opdateret.

Hvis tabelstatistikken er skrald, er der små chancer for, at optimeringsværktøjet vil bruge dine indekser. Støvsug/analyser din database manuelt, hvis det er nødvendigt.

6. Indeksbrug afhænger af din tabelopdeling.

Efter en vis tærskel for hentede rækker vil det være hurtigere at lave en fuld tabelscanning. Hvis dit indeks er på et boolesk felt, der mere eller mindre deler dit bord i to, vil det aldrig blive brugt.

Ligeledes, hvis dine data er lagret på en sådan måde, at indeksscanningen sandsynligvis vil ende med tilfældig adgang til næsten altid gældende diskside for den tabel, vil planlæggeren foretrække en fuld tabelscanning.

7. Overvej delvise/udtryksindekser, når de er tilgængelige.

Hvis du har et felt, der har den samme værdi bortset fra 10 % af dine rækker, skal du overveje et delvist indeks på det (dvs. hvor ikke den værdi). Dette resulterer i et meget mindre indeks uden at hindre dets faktiske anvendelighed.

Hvis du konstant forespørger på et udtryk, der er anvendt på din kolonne, og din platform tilbyder udtryksindekser, kan du overveje at tilføje et indeks på det. Når det bruges, vil udtrykket ikke blive evalueret for hver række.



  1. Unik begrænsning på kombination af to kolonner?

  2. Hvordan matcher jeg en hel dag med et dato-tidsfelt?

  3. PostgreSQL – Sådan fjerner du gentagne værdier

  4. Ryd MySQL-forespørgselscache uden at genstarte serveren