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", "ĐĄ", "B", "Z", "ĐĄc", "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...
GO TO FULL VERSION