7.1 Gründe für das Erscheinen von Indizes

Eine weitere wichtige Sache, ohne die es keine Datenbanken geben kann, sind Indizes.

Stellen Sie sich eine Situation vor, in der die Benutzertabelle 10 Millionen Benutzer enthält und Sie alle anzeigen möchten, deren Level über 90 liegt. Diese Abfrage ist sehr einfach zu schreiben:

SELECT * FROM user WHERE level > 90

Super, wir haben die Anfrage in weniger als einer Minute geschrieben. Und wie lange wird es dauern, diese Abfrage vom SQL-Server auszuführen? Um eine solche Abfrage auszuführen, muss er 10 Millionen Datensätze durchgehen, und selbst wenn es nur einen Datensatz gibt, wird es viel Zeit in Anspruch nehmen.

Wie würden wir eine ähnliche Aufgabe in Java erledigen? Wir würden die Sammlung der Benutzer zunächst nach Ebene sortieren und dann mithilfe einer binären Suche sehr schnell die erforderlichen Datensätze finden. Ich hoffe, ich muss nicht erklären, was es ist?

Großartig, aber was wäre, wenn wir jetzt Benutzer auswählen müssten, deren Registrierungsdatum vor 2020 lag? Sortieren Sie erneut nach Registrierungsdatum und verwenden Sie die binäre Suche.

Ja, wenn wir einen Filter auf ein bestimmtes Feld anwenden, und zwar nicht nur einmal, sondern oft, dann ist es sehr nützlich, die Daten nach diesem Feld sortiert zu speichern.

Und wie speichert man Daten gleichzeitig sortiert nach verschiedenen Feldern?

Und die Antwort ist ganz einfach: Sie müssen nicht die Daten selbst, sondern ihre Indizes in einer globalen Tabelle speichern.

Nehmen wir an, es gibt 10 Benutzer mit der ID: {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}.

Wenn Sie sich entscheiden, sie nach Ebene zu sortieren, sieht das Array ihrer IDs beispielsweise so aus: {9, 2, 3, 1, 5, 4, 8, 6, 7, 10}.

Und wenn wir sie nach Datum sortieren, dann erhalten wir zum Beispiel: {10, 1, 8, 7, 2, 3, 5, 9, 6}.

Arrays dieser IDs werden als Indizes bezeichnet . Die Elemente selbst sind groß, wir berühren sie nicht. In Java berühren wir keine Objekte, sondern speichern ihre Referenzen; in SQL berühren wir keine echten Strings, sondern speichern ihre Zahlen.

Lassen Sie mich dies in Java-Code umschreiben:

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

Sammlungen zu sortieren bedeutet nicht, die eigentlichen Elemente zu verschieben. Die Sammlung speichert keine realen Objekte, sondern verweist auf diese. Dasselbe gilt auch für SQL-Tabellen. Echte Linien belügen sich selbst und lügen.

Und wenn wir häufig eine Auswahl für ein Feld treffen müssen, fügen wir der Tabelle einen weiteren Index hinzu (analog zu einer neuen Sammlung in Java) und sortieren die Zeilen der Tabelle und speichern ihre Sortierreihenfolge in einer speziellen Indexdatei.

Ich hoffe, der Java-Vergleich hat ein wenig geholfen. Ein wenig Übung – und auch für Sie wird der Einsatz von Indizes zur naheliegendsten Lösung.

7.2 Indizes zu einer Tabelle hinzufügen

Der Index kann direkt beim Erstellen der Tabelle angegeben oder danach hinzugefügt werden. Am häufigsten tritt das zweite Szenario auf: Indizes werden hinzugefügt, wenn die Tabellengröße zunimmt und die Datenerfassung langsamer wird.

Das Hinzufügen eines Index zu einer Tabelle ist sehr einfach:

ALTER TABLE table
    ADD INDEX index_name (column);

Wenn Sie häufig Datensätze in mehreren Spalten gleichzeitig suchen, können Sie einen zusammengesetzten Index angeben: SQL verwendet mehrere Spalten, um ihn zusammenzustellen.

Das Hinzufügen eines zusammengesetzten Index zu einer Tabelle ist ebenfalls sehr einfach:

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

Indizes beanspruchen viel Speicherplatz. Wenn Sie einen Index also nicht mehr benötigen, können Sie ihn jederzeit entfernen:

ALTER TABLE table
    DROP INDEX index_name;

Die Indizes selbst sind ein eher versteckter Teil der Datenbank. Sie haben keinerlei Einfluss auf das Format der Abfragen. Es ist nur so, dass ihre Anwesenheit die Datenerfassung beschleunigt und deren Hinzufügung und Sicherung verlangsamt.

Aber wenn man bedenkt, wie wichtig Geschwindigkeit in der heutigen Welt ist und wie günstig Speicherplatz ist, können Sie jederzeit Indizes hinzufügen. Verzeiht mir Admins...