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

Mysql-dækkende vs sammensat vs kolonneindeks

Et dækkende indeks er ikke det samme som et sammensat indeks.

Hvis jeg har 2 separate indekser, det ene på col3 og det andet på col4, hvilken af ​​dem vil blive brugt i denne forespørgsel?

Indekset med den højeste kardinalitet.
MySQL fører statistik over, hvilket indeks der har hvilke egenskaber.
Det indeks, der har den mest diskriminerende kraft (som det fremgår af MySQL's statistik), vil blive brugt.

Jeg læste et sted, at der kun bruges ét indeks for hver tabel i forespørgslen. Betyder det, at der ikke er nogen måde for forespørgslen at bruge begge indekser?

Du kan bruge et undervalg.
Eller endnu bedre brug et sammensat indeks, der inkluderer både col3 og col4.

For det andet, hvis jeg oprettede et sammensat indeks ved at bruge både col3 og col4 sammen, men kun brugte col3 i WHERE-sætningen, vil det være værre for ydeevnen? eksempel:

Sammensat indeks
Det korrekte udtryk er compound indeks, ikke sammensat.
Kun den længst til venstre en del af det sammensatte indeks vil blive brugt.
Så hvis indekset er defineret som

index myindex (col3, col4)  <<-- will work with your example.
index myindex (col4, col3)  <<-- will not work. 

Se:http://dev.mysql.com /doc/refman/5.0/da/multiple-column-indexes.html

Bemærk, at hvis du vælger et felt længst til venstre, kan du slippe af sted med ikke at bruge den del af indekset i din where-klausul.
Forestil dig, at vi har et sammensat indeks

Myindex(col1,col2)

SELECT col1 FROM table1 WHERE col2 = 200  <<-- will use index, but not efficiently
SELECT * FROM table1 where col2 = 200     <<-- will NOT use index.  

Grunden til, at dette virker, er, at den første forespørgsel bruger det dækkende indeks og foretager en scanning af det.
Den anden forespørgsel skal have adgang til tabellen, og af den grund giver scanning, selvom indekset ikke giver mening.
Dette virker kun i InnoDB.

Hvad er et dækkende indeks
Et dækkende indeks refererer til det tilfælde, hvor alle felter, der er valgt i en forespørgsel, er covered ved et indeks, i så fald vil InnoDB (ikke MyISAM) aldrig læse dataene i tabellen, men kun bruge dataene i indekset, hvilket fremskynder udvælgelsen markant.
Bemærk at i InnoDB er primærnøglen inkluderet i alle sekundære indekser, så på en måde er alle sekundære indekser sammensatte indekser.
Det betyder, at hvis du kører følgende forespørgsel på InnoDB:

SELECT indexed_field FROM table1 WHERE pk = something

MySQL vil altid bruge et dækkende indeks og vil ikke få adgang til den faktiske tabel. Selvom den kunne bruge et dækkende indeks, vil den foretrække PRIMARY KEY fordi den kun skal ramme en enkelt række.



  1. Hvordan angiver jeg datoen, når jeg skriver SQL-forespørgsel fra SQL Server, der er knyttet til Oracle?

  2. Lagring af lange binære (rådata) strenge

  3. Konfigurer SQL Server Always ON Tilgængelighedsgrupper mellem to synkrone replikaer. Del 2

  4. 🆕 SQL Server 2022 First Look - Top 5 nye funktioner (Bonus 5 funktioner)