sql >> Database teknologi >  >> RDS >> Sqlserver

Hvilke kolonner giver generelt gode indekser?

Indekser kan spille en vigtig rolle i forespørgselsoptimering og hurtig søgning efter resultater fra tabeller. Så det er det vigtigste trin at vælge, hvilke kolonner der skal indekseres. Der er to store steder, hvor vi kan overveje at indeksere:kolonner, der henvises til i WHERE-sætningen og kolonner, der bruges i JOIN-klausuler. Kort sagt bør sådanne kolonner indekseres, som du er forpligtet til at søge i bestemte poster. Antag, at vi har en tabel med navnet købere, hvor SELECT-forespørgslen bruger indekser som nedenfor:

SELECT
 buyer_id /* no need to index */
FROM buyers
WHERE first_name='Tariq' /* consider to use index */
AND last_name='Iqbal'   /* consider to use index */

Da der refereres til "buyer_id" i SELECT-delen, vil MySQL ikke bruge det til at begrænse de valgte rækker. Derfor er der ikke noget stort behov for at indeksere det. Nedenstående er et andet eksempel lidt anderledes end ovenstående:

SELECT
 buyers.buyer_id, /* no need to index */
 country.name    /* no need to index */
FROM buyers LEFT JOIN country
ON buyers.country_id=country.country_id /* consider to use index */
WHERE
 first_name='Tariq' /* consider to use index */
AND
 last_name='Iqbal' /* consider to use index */

I henhold til ovenstående forespørgsler first_name kan last_name kolonner indekseres, da de er placeret i WHERE-sætningen. Også et ekstra felt, country_id fra country table, kan overvejes til indeksering, fordi det er i en JOIN-klausul. Så indeksering kan overvejes på hvert felt i WHERE-klausulen eller en JOIN-klausul.

Den følgende liste giver også et par tips, som du altid bør huske på, når du har til hensigt at oprette indekser i dine tabeller:

  • Indeksér kun de kolonner, der kræves i WHERE- og ORDER BY-sætninger. Indeksering af kolonner i overflod vil resultere i nogle ulemper.
  • Prøv at drage fordel af "indekspræfiks" eller "indeks med flere kolonner" i MySQL. Hvis du opretter et indeks såsom INDEX(fornavn, efternavn), skal du ikke oprette INDEX(fornavn). Men "indekspræfiks" eller "indeks med flere kolonner" anbefales ikke i alle søgetilfælde.
  • Brug NOT NULL-attributten til de kolonner, hvor du overvejer indekseringen, så NULL-værdier aldrig bliver gemt.
  • Brug muligheden --log-long-format til at logge forespørgsler, der ikke bruger indekser. På denne måde kan du undersøge denne logfil og justere dine forespørgsler i overensstemmelse hermed.
  • EXPLAIN-sætningen hjælper dig med at afsløre, hvordan MySQL vil udføre en forespørgsel. Det viser, hvordan og i hvilken rækkefølge tabeller samles. Dette kan være meget nyttigt til at bestemme, hvordan man skriver optimerede forespørgsler, og om kolonnerne er nødvendige for at blive indekseret.

Opdatering (23. feb'15):

Ethvert indeks (godt/dårligt) øger indsættelses- og opdateringstiden.

Afhængigt af dine indekser (antal indekser og type), søges resultatet. Hvis din søgetid vil stige på grund af indeks, er det et dårligt indeks.

Sandsynligvis i enhver bog kan "Indeksside" have kapitelstartside, emnesidenummer starter, også underemnesidestart. Nogle præciseringer på indekssiden hjælper, men mere detaljeret indeks kan forvirre dig eller skræmme dig. Indekser har også hukommelse.

Indeksvalg bør være klogt. Husk, at ikke alle kolonner kræver indeks.



  1. SQL Natural Join

  2. SQL Server JSON_Modify, hvordan opdateres alle?

  3. Hierarkisk SQL-spørgsmål

  4. Wordnet sqlite synonymer og prøver