Oversigt Hvad er et enkelt indeks, og hvad er et sammensat indeks? Hvornår skal man oprette et nyt sammensat indeks, og hvad skal jeg være opmærksom på i det sammensatte indeks? Denne artikel er hovedsageligt et resumé af nogle diskussioner på internettet.
En. Koncept
Et enkelt indeks er en situation, hvor indekset er opført i én kolonne, det vil sige, at udsagnet om oprettelse af et nyt indeks implementeres i kun én kolonne.
Brugere kan oprette indekser på flere kolonner, som kaldes sammensatte indekser (kombinerede indekser). Sammensatte indekser oprettes på præcis samme måde som enkeltindekser. Men sammensatte indekser kræver mindre overhead under databaseoperationer og kan erstatte flere enkeltindekser. Når antallet af rækker i en tabel er meget større end antallet af nøgler, kan denne metode markant øge forespørgselshastigheden for tabellen.
Der er to begreber på samme tid: smalle indekser og brede indekser, smalle indekser refererer til indekser med 1-2 kolonner og refererer generelt til et enkelt indeks, medmindre andet er angivet. Et bredt indeks er et indeks med mere end 2 kolonner.
Et vigtigt princip for indeksdesign er at bruge smalle indeks i stedet for brede indekser, fordi smalle indeks ofte er mere effektive end kombinerede indekser. At have smallere indekser giver optimereren flere valgmuligheder, hvilket ofte hjælper med at forbedre ydeevnen.
To. Anvendelse
Opret et indeks Opret indeks IDX1 på tabel1(kol1,kol2,kol3) Spørge vælg * fra tabel1 hvor kol1= A og kol2= B og kol3 = C
På dette tidspunkt scanner forespørgselsoptimereren ikke tabellen, men tager direkte data fra indekset, fordi der er disse data i indekset, som kaldes en overlay-forespørgsel, og forespørgselshastigheden er meget høj.
Tre. Noter:
1. Hvornår skal man bruge et sammensat indeks I where-betingelsen er feltet indekseret, og hvis flere felter bruges, anvendes et sammensat indeks. Generelt skal du ikke bygge indekser i select-feltet (hvis du vil forespørge select col1, col2, col3 fra mytable, behøver du ikke ovenstående indeks). Indeksering baseret på hvor betingelser er et yderst vigtigt princip. Vær forsigtig med ikke at bruge for mange indekser, ellers vil det have stor indflydelse på effektiviteten af tabelopdateringer, fordi du skal bruge meget tid på at oprette indekser, når du opererer tabeller.
2. For sammensatte indekser er det bedst at følge rækkefølgen af søgningsindekser, som er mest effektiv, når man bruger forespørgsler. For eksempel: IDX1: skab indeks idx1 på table1(col2,col3,col5) vælg * fra tabel1 hvor kol2=A og kol3=B og kol5=D
Hvis det er "vælg * fra tabel1, hvor kol3=B og kol2=A og kol5=D" Eller "vælg * fra tabel1 hvor kol3=B" ikke vil bruge indekset, eller effekten ikke er mærkbar
3. Vil et sammensat indeks erstatte et enkelt indeks? Mange tror, at tilføjelse af et hvilket som helst felt til det klyngede indeks kan forbedre forespørgselshastigheden, men nogle er forvirrede: Hvis de sammensatte klyngede indeksfelter forespørges separat, vil forespørgselshastigheden så blive sænket? Med dette spørgsmål lad os se på følgende forespørgselshastighed (resultatsættet er 250.000 datastykker) :( datokolonne fariqi ligger først i startkolonnen i det sammensatte aggregationsindeks, og brugernavnet neibuyonghu er nummer to)
IDX1:create index idx1 on Tgongwen(fariqi,neibuyonghu)
(1) vælg gid, fariqi, neibuyonghu, titel fra Tgongwen hvor fariqi>'2004-5-5'
Forespørgselshastighed: 2513 ms
(2) Vælg Gid, Fariqi, Neibuyonghu, titel fra Tgongwen hvor fariqi>'2004-5-5' og neibuyonghu='kontor'
Forespørgselshastighed: 2516 ms
(3) Vælg Gid, Fariqi, Neibuyonghu, titel fra Tgongwen hvor neibuyonghu = 'kontor'
Forespørgselshastighed: 60280 millisekunder
Ud fra ovenstående eksperimenter kan vi se, at hvis kun startkolonnen i det klyngede indeks bruges som forespørgselsbetingelse, er forespørgselshastigheden for alle kolonner med det sammensatte klyngede indeks næsten den samme, endda en smule hurtigere end brugen af alle sammensatte indekskolonner (når antallet af forespørgselsresultatsæt er det samme). Hvis kun de ikke-startende kolonner i det sammensatte aggregerede indeks bruges som forespørgselsbetingelser, vil dette indeks ikke gøre noget. Selvfølgelig er forespørgselshastigheden for udsagn 1 og 2 den samme, fordi antallet af poster i forespørgslen er det samme; hvis alle kolonnerne i det sammensatte indeks bruges, og forespørgselsresultaterne er få, vil dette danne en "indeksoverride", så ydelsen kan optimeres. Husk også, at uanset om du ofte bruger andre kolonner i det samlede indeks eller ej, skal den førende kolonne være den, der bruges oftest.
[Ref: Forespørgselsoptimering og pagineringsalgoritme-skema http://blog.csdn.net/chiefsailor/archive/2007/05/28/1628339.aspx]
4. Skal jeg oprette et enkelt indeks og et sammensat indeks i samme kolonne på samme tid? Eksperiment: Sysbase 5.0 tabel tabel1 felter: kol1, kol2, kol3
Testtrin: (1) Opret indekset idx1 på col1 Udfør select * fra table1, hvor col1=A bruger idx1 Udfør select * fra table1, hvor col1=A og col2=B også brug idx1
(2) Slet indekset idx1, og opret derefter et idx2 på (kol1,kol2) sammensat indeks Begge forespørgsler bruger idx2
(3) Hvis begge indeks idx1 og idx2 eksisterer Det er ikke der, hvor kol1='A' bruger idx1; hvor kol1=A og kol2=B bruger idx2. Dens forespørgselsoptimering bruger et af de tidligere almindeligt anvendte indekser. Brug enten idx1 eller idx2.
Det kan ses, at (1) For en tabel, hvis der er et sammensat indeks på (kol1, kol2), er der ikke behov for at oprette et enkelt indeks på kol1 samtidig. (2) Hvis forespørgselsbetingelserne kræver det, kan du tilføje det sammensatte indeks på (kol1, kol2), når der allerede er et enkelt indeks på kol1, hvilket kan forbedre effektiviteten til en vis grad. (3) Der er ikke særligt mange fordele ved at etablere et sammensat indeks med flere felter (der indeholder 5 eller 6 felter) på samme tid; relativt set kan etablering af et indeks med flere smalle felter (der kun indeholder ét eller højst 2 felter) opnå bedre effektivitet og fleksibilitet.
5. Skal jeg dække forespørgslen? Det er generelt bedst ikke at anvende en strategi, der lægger vægt på fuld søgedækning. Hvis alle kolonner i Select-klausulen overskrives af et ikke-klynget indeks, vil optimereren genkende dette og levere god ydeevne. Dette resulterer dog ofte i et alt for bredt indeks og overafhængighed af sandsynligheden for, at optimereren bruger politikken. Typisk bruges smalle indekser til et større antal forespørgsler, hvilket giver bedre ydeevne for store forespørgsler. |