7.1 Årsager til fremkomsten af indekser
En anden vigtig ting, uden hvilken der ikke kan være nogen databaser, er indekser.
Forestil dig en situation, hvor der er 10 millioner brugere i brugertabellen , og du vil vise alle, der har et niveau over 90. Denne forespørgsel er meget enkel at skrive:
SELECT * FROM user WHERE level > 90
Fantastisk, vi skrev anmodningen på mindre end et minut. Og hvor lang tid vil det tage at udføre denne forespørgsel fra SQL-serveren? For at udføre sådan en forespørgsel skal han gennemgå 10 millioner poster, og selvom der kun er én post, vil det tage meget tid.
Hvordan ville vi lave en lignende opgave i Java? Vi ville først sortere samlingen af brugere efter niveau, og derefter kunne vi meget hurtigt finde de nødvendige poster ved hjælp af en binær søgning. Jeg håber ikke, jeg behøver at forklare, hvad det er?
Fantastisk, men hvad nu hvis vi nu skal vælge brugere, hvis registreringsdato var før 2020? Sorter igen efter registreringsdato og brug binær søgning.
Ja, hvis vi udfører et filter på et eller andet felt, og ikke kun én gang, men ofte, så vil det være meget nyttigt at gemme dataene sorteret efter dette felt.
Og hvordan gemmer man data sorteret samtidigt efter forskellige felter?
Og svaret er meget enkelt - du skal ikke gemme selve dataene, men deres indekser i en global tabel.
Lad os sige, at der er 10 brugere med id: {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
.
Og du beslutter dig for at sortere dem efter niveau, så vil arrayet af deres id for eksempel være sådan her: {9, 2, 3, 1, 5, 4, 8, 6, 7, 10}
.
Og sorterer vi dem efter dato, så får vi f.eks.: {10, 1, 8, 7, 2, 3, 5, 9, 6}
.
Arrays af disse id kaldes indekser . Selve elementerne er store, vi rører dem ikke. I Java rører vi ikke objekter, men gemmer deres referencer; i SQL rører vi ikke rigtige strenge, men gemmer deres numre.
Lad mig omskrive dette i Java-kode:
List<String> list = List.of("A", "C", "B", "Z", "Cc", "Bb", "Zz", "Y"); //this is a list of objects
List<String> alphabeticsList = new ArrayList(list);
Collections.sort(alphabeticsList); //collection sorted alphabetically
List<String> lengthList = new ArrayList(list);
Collections.sort(lengthList, lengthComparator); //collection sorted by string length
At sortere samlinger betyder ikke at flytte de faktiske elementer. Samlingen gemmer ikke rigtige genstande, men links til dem. Det samme gælder for SQL-tabeller. Rigtige linjer lyver for sig selv og lyver.
Og når vi ofte skal foretage valg for et eller andet felt, så tilføjer vi endnu et indeks til tabellen (analogt med en ny samling i Java) og sorterer rækkerne i tabellen, gemmer deres sorterede rækkefølge i en speciel indeksfil.
Jeg håber, at Java-sammenligningen hjalp lidt. Lidt øvelse – og for dig bliver brugen af indekser også den mest oplagte løsning.
7.2 Tilføjelse af indekser til en tabel
Indekset kan angives umiddelbart under oprettelsen af tabellen, eller tilføjes efter. Oftest er det det andet scenarie, der opstår - indekser tilføjes, efterhånden som tabelstørrelsen vokser, og datasamplingen bliver langsommere.
At tilføje et indeks til en tabel er meget simpelt:
ALTER TABLE table
ADD INDEX index_name (column);
Hvis du ofte slår poster op i flere kolonner på samme tid, kan du angive et sammensat indeks: SQL bruger flere kolonner til at komponere det.
Tilføjelse af et sammensat indeks til en tabel er også meget enkelt:
ALTER TABLE table
ADD INDEX index_name (column 1, column 2, column 3, ...);
Indekser optager meget diskplads, så hvis du ikke længere har brug for et indeks, kan du altid fjerne det:
ALTER TABLE table
DROP INDEX index_name;
Selve indekserne er en ret skjult del af databasen. De påvirker ikke formatet til at skrive forespørgsler på nogen måde. Det er bare, at deres tilstedeværelse fremskynder datasampling og sinker deres tilføjelse og backup.
Men i betragtning af hvor vigtig hastighed er i dagens verden, og hvor billig diskplads er, er du velkommen til at tilføje indekser til alle lejligheder. Undskyld mig administratorer...
GO TO FULL VERSION