MySQL-Interviewfragen: So richten Sie Hash-Indizes ein

MySQL-Interviewfragen: So richten Sie Hash-Indizes ein

Zusätzlich zu den B-Tree-Indizes bietet MySQL auch die folgenden Indizes:

  • Hash-Index

Wird nur von der Memory Engine unterstützt, einfache Szenarien

  • R-Baum-Index

Ein spezieller Indextyp von MyISAM, der hauptsächlich für geografische räumliche Datentypen verwendet wird

  • Volltext

Ein spezieller Index von MyISAM, der hauptsächlich für die Volltextindizierung verwendet wird. Ab MySQL 5.6 unterstützt InnoDB die Volltextindizierung.

Index/ Speicher-EngineMyISAMInnoDBMemoryB-Tree IndexUnterstützungUnterstützungUnterstützungHASH IndexUnterstützungUnterstützungUnterstützungR-Tree IndexUnterstützungUnterstützungVolltext IndexUnterstützungUnterstützungUnterstützung

Die am häufigsten verwendeten Indizes sind B-Tree-Index und Hash-Index, und nur Memory- und NDB-Engines unterstützen Hash-Index. Der Hash-Index eignet sich für Schlüssel-Wert-Abfragen, und Abfragen über den Hash-Index sind schneller als B-Tree-Index. Hash-Indizes unterstützen jedoch keine Bereichssuchen wie <><==, >== usw. Der Speicher verwendet den Hash-Index nur unter der Bedingung "="

MySQL 8.0 unterstützt funktionale Indizes. Zuvor konnte nur der vordere Teil einer Spalte indiziert werden. Beispielsweise konnten bei einem Titelfeld nur die ersten 10 Zeichen des Titels indiziert werden. Diese Funktion reduziert die Größe der Indexdatei erheblich, aber Präfixindizes haben auch Nachteile und sind bei Order-By- und Group-By-Operationen ungültig.

Erstelle den Index idx_title für Film(Titel(10));

1 Merkmale

Es gibt nur ein Array, mithilfe einer Hash-Funktion wird der Schlüssel in einen bestimmten Speicherplatz konvertiert und anschließend wird der Wert an dieser Stelle im Array abgelegt. Bei der Verwendung von Hashes besteht natürlich die Möglichkeit von Hash-Konflikten, und MySQL verwendet die Zipper-Methode, um diese zu lösen.

Hash-Indizes werden basierend auf Hash-Tabellen implementiert. Hash-Indizes können nur verwendet werden, wenn die Abfragebedingungen genau mit den Spalten im Hash-Index übereinstimmen. Für alle Spalten im Hash-Index berechnet die Speicher-Engine einen Hashcode für jede Zeile, und der Hashcode wird im Hash-Index gespeichert.

  • Beispielsweise verfügt eine Tabelle, die ID-Nummern und Namen verwaltet und auf der Grundlage von ID-Nummern nach entsprechenden Namen sucht, über den folgenden Hash-Index:

Alibaba-Interviewer: Können Sie einen MySQL-Hash-Index entwerfen?

Beispielsweise möchten wir den Benutzernamen überprüfen, der zu ID_card_n4 gehört:

  • Berechnen Sie ID_card_n4 mit der Hash-Funktion, um A zu erhalten
  • Der Reihe nach durchlaufen und Benutzer4 finden

Die vier ID_card_n-Werte müssen nicht unbedingt der Reihe nach ansteigen, sodass die Geschwindigkeit auch beim Hinzufügen eines neuen Benutzers hoch ist und nur am Ende angehängt werden muss. Natürlich liegen auch die Nachteile auf der Hand: Es ist nicht geordnet, sodass der Hash-Index bei Intervallabfragen sehr langsam ist. Wenn Sie beispielsweise alle Benutzer finden möchten, deren ID-Nummern im Bereich [ID_card_X, ID_card_Y] liegen, müssen Sie die gesamte Tabelle scannen.

2 Hash-Index-Defekte

  • Muss zweimal suchen
  • Unterstützt keine Teilindexsuche oder Bereichssuche
  • Hash-Codes können Hash-Kollisionen aufweisen. Wenn der Hash-Algorithmus nicht gut konzipiert ist, kommt es zu vielen Kollisionen und die Leistung verschlechtert sich.
  • Der Index speichert Hashwerte, daher werden nur < = > und IN unterstützt.
  • Eine Sortierung durch Indexoperationen ist nicht möglich, da der Hashwert beim Speichern berechnet wird, der berechnete Hashwert jedoch nicht unbedingt dem gespeicherten Wert entspricht und daher nicht sortiert werden kann.
  • Der vollständige Tabellenscan lässt sich nicht vermeiden, aber die Speichertabelle unterstützt nicht eindeutige Hash-Indizes, d. h. verschiedene Indexschlüssel können denselben Hash-Wert haben.
  • Da es sich bei einer Hash-Tabelle um eine Datenstruktur handelt, die auf der Grundlage von Schlüsselwörtern direkt auf Speicherorte zugreift, müssen bei Verwendung ihres Haupt-Hash-Index alle Datendateien zum Speicher hinzugefügt werden, was sehr viel Speicher verbraucht.
  • Wenn alle Abfragen gleichwertige Abfragen sind, ist Hashing tatsächlich schnell, aber in Wirklichkeit sind Bereichssuchdaten mehr
  • Intelligente Verarbeitung des vollständigen Werteabgleichs von Schlüsselwerten
  • Die Abfrage-Hash-Funktion bestimmt die Größe des Indexschlüssels

Um InnoDB oder MyISAM dazu zu bringen, Hash-Indexe zu unterstützen, kann dies durch einen Pseudo-Hash-Index, einen sogenannten adaptiven Hash-Index, implementiert werden.

Sie können ein Feld zum Speichern des Hash-Werts hinzufügen, den Hash-Wert indizieren und einen Trigger erstellen, um den berechneten Hash beim Einfügen und Aktualisieren automatisch zur Tabelle hinzuzufügen.

Die Hashtabellenstruktur eignet sich für Szenarien, in denen nur Abfragen mit gleichwertigen Werten erforderlich sind, wie beispielsweise Memcached.

3 Fallanwendung

Angenommen, es gibt eine sehr große Tabelle. Wenn sich beispielsweise ein Benutzer anmeldet, müssen Sie den Benutzer per E-Mail abrufen. Wenn Sie einen Index direkt für die E-Mail-Spalte erstellen, müssen Sie zusätzlich zum Indexbereichsabgleich auch einen Zeichenfolgenabgleich durchführen. Es ist in Ordnung, wenn die E-Mail kurz ist, aber wenn sie lang ist, sind die Abfragekosten relativ hoch. Wenn zu diesem Zeitpunkt ein Hash-Index für die E-Mail erstellt und die Abfrage mit int ausgeführt wird, ist die Leistung viel schneller als bei einer Zeichenfolgenvergleichsabfrage.

Hash-Algorithmen

Um einen Hash-Index zu erstellen, müssen Sie zuerst einen Hash-Algorithmus auswählen, beispielsweise den in „High Performance MySQL“ erwähnten CRC32-Algorithmus.

INSERT UPDATE SELECT Operationen

Fügen Sie der Tabelle ein Hashwertfeld hinzu:

ALTER TABLE „Benutzer“ ADD COLUMN email_hash int unsigned NOT NULL DEFAULT 0;

Der nächste Schritt besteht darin, das Feld „email_hash“ während UPDATE und INSERT automatisch zu aktualisieren, was durch Trigger erreicht wird:

TRENNUNGSZEICHEN |
Erstellen Sie den Trigger user_hash_insert vor dem INSERT auf `User` für jede Zeile beginnen
SETZEN SIE NEW.email_hash=crc32(NEW.email);
ENDE;
|
Erstellen Sie den Trigger user_hash_update vor dem Update auf `User` für jede Zeile beginnen
SETZEN SIE NEW.email_hash=crc32(NEW.email);
ENDE;
|
TRENNUNGSZEICHEN ;

Die SELECT-Anfrage wird dann zu:

SELECT `email`, `email_hash` FROM `Benutzer` WHERE 
	email_hash = CRC32(„[email protected]“) 
			UND `E-Mail` = "[email protected]";

+----------------------------+------------+
| E-Mail | E-Mail-Hash |
+----------------------------+------------+
| [email protected] | 2765311122 |
+----------------------------+------------+

UND E-Mail = „[email protected]“ dient dazu, Datenungenauigkeiten im Falle einer Hash-Kollision zu vermeiden.

Dies ist das Ende dieses Artikels zum Einrichten eines Hash-Index in MySQL-Interviewfragen. Weitere Informationen zum Einrichten eines Hash-Index in MySQL finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder durchsuchen Sie die verwandten Artikel weiter unten. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • Detaillierte Analyse der MySQL-Indexdatenstruktur
  • Detaillierte Erklärung der Transaktionen und Indizes in der MySQL-Datenbank
  • Details zum MySQL-Index-Pushdown
  • MySQL hilft Ihnen, Index-Pushdown in Sekunden zu verstehen
  • MySQL-Index-Pushdown in fünf Minuten verstehen
  • Ein Artikel zum Verständnis von MySQL Index Pushdown (ICP)

<<:  Zwei Methoden zum Strecken des Hintergrundbilds einer Webseite

>>:  Grundlegendes Lernprogramm zum Tabellen-Tag in HTML

Artikel empfehlen

Json-String + Cookie + lokaler Speicher in JS

Inhaltsverzeichnis 1.JSON-Zeichenfolge 1.1Json-Sy...

8 Befehle zur effektiven Verwaltung von Prozessen in Linux

Vorwort Die Rolle des Prozessmanagements: Integri...

MySQL-Grundlagen-Tutorial: Detaillierte Erklärung der DML-Anweisungen

Inhaltsverzeichnis DML-Anweisungen 1. Datensätze ...

Über die Überlappung von Randwert und vertikalem Rand in CSS

Rand paralleler Boxen (Überlappung doppelter Ränd...

Schritte eines hervorragenden Registrierungsprozesses

Für eine Website ist dies die grundlegendste Funkt...

CSS erzielt den Effekt der Vermischung zweier Elemente (Sticky-Effekt)

Ich erinnere mich, dass es vor ein paar Jahren in...

Einige wunderbare Verwendungsmöglichkeiten von URL-Objekten in JavaScript

Inhaltsverzeichnis Vorwort Parameter analysieren ...

js, um die Produktionsmethode des Karussells zu realisieren

In diesem Artikel wird der spezifische Code für j...

Verwendung regulärer Ausdrücke in CSS-Selektoren

Ja, CSS hat auch reguläre Ausdrücke (Amen) Zwei l...

Lernen wir JavaScript objektorientiert kennen

Inhaltsverzeichnis JavaScript-Prototypenkette Obj...