7.1 Orsaker till uppkomsten av index

En annan viktig sak utan vilken det inte kan finnas några databaser är index.

Föreställ dig en situation där det finns 10 miljoner användare i användartabellen och du vill visa alla som har en nivå över 90. Den här frågan är väldigt enkel att skriva:

SELECT * FROM user WHERE level > 90

Bra, vi skrev förfrågan på mindre än en minut. Och hur lång tid tar det att köra den här frågan från SQL-servern? För att utföra en sådan förfrågan kommer han att behöva gå igenom 10 miljoner poster, och även om det bara finns en post kommer det att ta mycket tid.

Hur skulle vi göra en liknande uppgift i Java? Vi skulle först sortera samlingen av användare efter nivå, och sedan kunde vi mycket snabbt hitta de nödvändiga posterna med en binär sökning. Jag hoppas att jag inte behöver förklara vad det är?

Bra, men tänk om vi nu behöver välja användare vars registreringsdatum var före 2020? Sortera igen efter registreringsdatum och använd binär sökning.

Ja, om vi utför ett filter på något fält, och inte bara en gång, utan ofta, så kommer det att vara mycket användbart att lagra data sorterad efter detta fält.

Och hur lagrar man data sorterad samtidigt efter olika fält?

Och svaret är väldigt enkelt - du behöver inte lagra själva data, utan deras index i någon global tabell.

Låt oss säga att det finns 10 användare med id: {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}.

Och du bestämmer dig för att sortera dem efter nivå, då blir matrisen av deras id till exempel så här: {9, 2, 3, 1, 5, 4, 8, 6, 7, 10}.

Och sorterar vi dem efter datum, då får vi till exempel: {10, 1, 8, 7, 2, 3, 5, 9, 6}.

Arrayer av dessa id kallas index . Själva elementen är stora, vi rör dem inte. I Java rör vi inte objekt, utan lagrar deras referenser, i SQL rör vi inte riktiga strängar, utan lagrar deras nummer.

Låt mig skriva om detta i Java-kod:

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

Att sortera samlingar betyder inte att de faktiska elementen flyttas. Samlingen lagrar inga riktiga föremål, utan länkar till dem. Detsamma gäller för SQL-tabeller. Riktiga linjer ljuger för sig själva och ljuger.

Och när vi ofta behöver göra val för något fält, lägger vi till ytterligare ett index i tabellen (analogt med en ny samling i Java) och sorterar raderna i tabellen, lagrar deras sorterade ordning i en speciell indexfil.

Jag hoppas att Java-jämförelsen hjälpte lite. Lite övning – och för dig kommer användningen av index också att bli den mest självklara lösningen.

7.2 Lägga till index i en tabell

Indexet kan specificeras omedelbart under skapandet av tabellen, eller läggas till efter. Oftast är det det andra scenariot som inträffar - index läggs till när tabellstorleken växer och datasamplingen saktar ner.

Att lägga till ett index i en tabell är väldigt enkelt:

ALTER TABLE table
    ADD INDEX index_name (column);

Om du ofta slår upp poster i flera kolumner samtidigt kan du ange ett sammansatt index: SQL använder flera kolumner för att komponera det.

Att lägga till ett sammansatt index i en tabell är också väldigt enkelt:

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

Index tar upp mycket diskutrymme, så om du inte längre behöver ett index kan du alltid ta bort det:

ALTER TABLE table
    DROP INDEX index_name;

Indexen i sig är en ganska dold del av databasen. De påverkar inte formatet för att skriva frågor på något sätt. Det är bara det att deras närvaro påskyndar datasamplingen och saktar ner deras tillägg och säkerhetskopiering.

Men med tanke på hur viktig hastighet är i dagens värld och hur billigt diskutrymme är, lägg gärna till index för alla tillfällen. Förlåt mig administratörer...