7.1 Årsaker til opptreden av indekser

En annen viktig ting uten hvilken det ikke kan være noen databaser er indekser.

Se for deg en situasjon der det er 10 millioner brukere i brukertabellen , og du vil vise alle som har et nivå over 90. Denne spørringen er veldig enkel å skrive:

SELECT * FROM user WHERE level > 90

Flott, vi skrev forespørselen på mindre enn ett minutt. Og hvor lang tid vil det ta å utføre denne spørringen fra SQL-serveren? For å utføre en slik spørring vil han måtte gå gjennom 10 millioner poster, og selv om det bare er én post, vil det ta mye tid.

Hvordan ville vi gjort en lignende oppgave i Java? Vi skulle først sortere samlingen av brukere etter nivå, og deretter kunne vi veldig raskt finne de nødvendige postene ved hjelp av et binært søk. Jeg håper jeg ikke trenger å forklare hva det er?

Flott, men hva om vi nå trenger å velge brukere hvis registreringsdato var før 2020? Sorter på nytt etter registreringsdato og bruk binært søk.

Ja, hvis vi utfører et filter på et felt, og ikke bare én gang, men ofte, vil det være veldig nyttig å lagre dataene sortert etter dette feltet.

Og hvordan lagre data sortert samtidig etter forskjellige felt?

Og svaret er veldig enkelt - du må lagre ikke selve dataene, men deres indekser i en global tabell.

La oss si at det er 10 brukere med id: {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}.

Og du bestemmer deg for å sortere dem etter nivå, så vil matrisen av ID-en deres for eksempel være slik: {9, 2, 3, 1, 5, 4, 8, 6, 7, 10}.

Og hvis vi sorterer dem etter dato, så får vi for eksempel: {10, 1, 8, 7, 2, 3, 5, 9, 6}.

Arrays av disse ID-ene kalles indekser . Selve elementene er store, vi berører dem ikke. I Java berører vi ikke objekter, men lagrer referansene deres; i SQL berører vi ikke ekte strenger, men lagrer tallene deres.

La meg skrive om 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

Sortering av samlinger betyr ikke å flytte de faktiske elementene. Samlingen lagrer ikke ekte gjenstander, men linker til dem. Det samme gjelder for SQL-tabeller. Ekte linjer lyver for seg selv og lyver.

Og når vi ofte trenger å gjøre valg for et felt, legger vi til en annen indeks i tabellen (analogt med en ny samling i Java) og sorterer radene i tabellen, lagrer den sorterte rekkefølgen deres i en spesiell indeksfil.

Jeg håper Java-sammenligningen hjalp litt. Litt øvelse – og for deg vil også bruk av indekser bli den mest åpenbare løsningen.

7.2 Legge til indekser i en tabell

Indeksen kan spesifiseres umiddelbart under opprettelsen av tabellen, eller legges til etter. Oftest er det det andre scenariet som oppstår - indekser legges til etter hvert som tabellstørrelsen vokser og datasamplingen avtar.

Å legge til en indeks i en tabell er veldig enkelt:

ALTER TABLE table
    ADD INDEX index_name (column);

Hvis du ofte slår opp poster i flere kolonner samtidig, kan du spesifisere en sammensatt indeks: SQL bruker flere kolonner for å komponere den.

Å legge til en sammensatt indeks i en tabell er også veldig enkelt:

ALTER TABLE table
    ADD INDEX index_name (column 1, column 2, column 3, ...);

Indekser tar opp mye diskplass, så hvis du ikke lenger trenger en indeks, kan du alltid fjerne den:

ALTER TABLE table
    DROP INDEX index_name;

Selve indeksene er en ganske skjult del av databasen. De påvirker ikke formatet for å skrive spørringer på noen måte. Det er bare at deres tilstedeværelse øker hastigheten på datasampling og senker tilsetningen og sikkerhetskopieringen deres.

Men med tanke på hvor viktig hastighet er i dagens verden og hvor billig diskplass er, kan du gjerne legge til indekser for alle anledninger. Tilgi meg admins...