7.1 Redenen voor het verschijnen van indexen

Een ander belangrijk ding zonder welke er geen databases kunnen zijn, zijn indexen.

Stel je een situatie voor waarin er 10 miljoen gebruikers in de gebruikerstabel zijn en je wilt iedereen weergeven met een niveau boven de 90. Deze query is heel eenvoudig te schrijven:

SELECT * FROM user WHERE level > 90

Geweldig, we hebben het verzoek in minder dan een minuut geschreven. En hoe lang duurt het om deze query uit te voeren vanaf de SQL-server? Om zo'n query uit te voeren, zal hij 10 miljoen records moeten doorlopen, en zelfs als er maar één record is, zal het veel tijd kosten.

Hoe zouden we een soortgelijke taak in Java uitvoeren? We zouden eerst de verzameling gebruikers sorteren op niveau, en dan konden we heel snel de benodigde records vinden met behulp van een binaire zoekopdracht. Ik hoop dat ik niet hoef uit te leggen wat het is?

Geweldig, maar wat als we nu gebruikers moeten selecteren met een registratiedatum van vóór 2020? Sorteer opnieuw op registratiedatum en gebruik binair zoeken.

Ja, als we een filter op een bepaald veld uitvoeren, en niet slechts één keer, maar vaak, dan is het erg handig om de gegevens gesorteerd op dit veld op te slaan.

En hoe gegevens tegelijkertijd gesorteerd op verschillende velden opslaan?

En het antwoord is heel eenvoudig: u hoeft niet de gegevens zelf op te slaan, maar hun indexen in een globale tabel.

Laten we zeggen dat er 10 gebruikers zijn met id: {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}.

En u besluit ze op niveau te sorteren, dan is de array van hun id bijvoorbeeld als volgt: {9, 2, 3, 1, 5, 4, 8, 6, 7, 10}.

En als we ze sorteren op datum, dan krijgen we bijvoorbeeld: {10, 1, 8, 7, 2, 3, 5, 9, 6}.

Arrays van deze id worden indexen genoemd . De elementen zelf zijn groot, we raken ze niet aan. In Java raken we geen objecten aan, maar slaan we hun referenties op; in SQL raken we geen echte strings aan, maar slaan we hun nummers op.

Laat me dit herschrijven in Java-code:

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

Het sorteren van collecties betekent niet het verplaatsen van de eigenlijke elementen. De collectie slaat geen echte objecten op, maar linkt ernaar. Hetzelfde geldt voor SQL-tabellen. Echte lijnen liegen tegen zichzelf en liegen.

En als we vaak selecties moeten maken voor een bepaald veld, dan voegen we een andere index toe aan de tabel (analoog aan een nieuwe verzameling in Java) en sorteren we de rijen van de tabel, slaan we hun gesorteerde volgorde op in een speciaal indexbestand.

Ik hoop dat de Java-vergelijking een beetje heeft geholpen. Een beetje oefening - en voor jou wordt het gebruik van indexen ook de meest voor de hand liggende oplossing.

7.2 Indexen toevoegen aan een tabel

De index kan direct worden opgegeven tijdens het maken van de tabel, of erna worden toegevoegd. Meestal is het het tweede scenario dat zich voordoet: indexen worden toegevoegd naarmate de tabel groter wordt en de gegevensbemonstering vertraagt.

Een index aan een tabel toevoegen is heel eenvoudig:

ALTER TABLE table
    ADD INDEX index_name (column);

Als u vaak records in meerdere kolommen tegelijk opzoekt, kunt u een samengestelde index opgeven: SQL gebruikt meerdere kolommen om deze samen te stellen.

Een samengestelde index toevoegen aan een tabel is ook heel eenvoudig:

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

Indexen nemen veel schijfruimte in beslag, dus als u een index niet meer nodig heeft, kunt u deze altijd verwijderen:

ALTER TABLE table
    DROP INDEX index_name;

De indexen zelf zijn een nogal verborgen onderdeel van de database. Ze hebben op geen enkele manier invloed op het formaat van het schrijven van query's. Het is alleen zo dat hun aanwezigheid het verzamelen van gegevens versnelt en het toevoegen en maken van back-ups vertraagt.

Maar als u bedenkt hoe belangrijk snelheid is in de wereld van vandaag en hoe goedkoop schijfruimte is, kunt u voor alle gelegenheden indexen toevoegen. Vergeef me beheerders...