Verstehen Sie die Prinzipien und Eigenschaften des MySQL-Index | JD Logistics Technical Team

Wenn Entwickler auf SQL stoßen, dessen Ausführung lange dauert, sagt im Grunde jeder „Index hinzufügen“. Aber was ist ein Index und was sind seine Eigenschaften? Lassen Sie uns kurz mit Ihnen darüber sprechen.

1 Wie Indizes funktionieren und wie man Abfragen beschleunigt

Ein Index ist wie ein Inhaltsverzeichnis in einem Buch, ein Datenbankobjekt, das die Geschwindigkeit des Datenzugriffs auf Datenbanktabellen verbessert. Wenn unsere Anfrage eingeht und ein Verzeichnis vorhanden ist, können wir das Kapitel schnell finden und dann die Daten aus dem Kapitel finden. Wenn es keinen Katalog gibt, ist es wie die Suche nach der Nadel im Heuhaufen, was natürlich schwierig ist. Dies ist der Übeltäter, dem wir oft begegnen: der vollständige Tabellenscan.

Zu den in einem Indexdatensatz enthaltenen Grundinformationen gehören: Schlüsselwert (d. h. die Werte aller beim Definieren des Index angegebenen Felder) + logischer Zeiger (der auf die Datenseite oder eine andere Indexseite zeigt). Da Indexdatensätze nur Indexfeldwerte (und 4 bis 9 Bytes an Zeigern) enthalten, sind Indexentitäten normalerweise viel kleiner als echte Datenzeilen und Indexseiten sind viel dichter als Datenseiten. Eine Indexseite kann eine größere Anzahl von Indexdatensätzen speichern, was bedeutet, dass bei der Suche im Index ein großer Vorteil bei der E/A besteht. Wenn Sie dies verstehen, können Sie im Wesentlichen die Vorteile der Verwendung von Indizes verstehen, was auch den größten Teil der Leistungsoptimierung ausmacht muss den Punkt eingeben.

1) Zugriffsdaten ohne Index:

2) Zugriff auf Daten mithilfe eines ausgewogenen binären Baumstrukturindex:

Das erste Bild verwendet keinen Index. Wir führen eine sequentielle Suche durch und gleichen sie nacheinander entsprechend der Reihenfolge der Daten ab. Es sind 5 Suchvorgänge erforderlich, um die erforderlichen Daten zu finden. Das zweite Bild verwendet einen einfachen ausgeglichenen Binärbaumindex. Danach Das heißt, wir verwenden es nur dreimal. Dies ist der Fall, wenn die Datenmenge klein ist. Der Effekt ist offensichtlicher, wenn die Datenmenge groß ist. Zusammenfassend besteht der Zweck der Indexerstellung darin, die Datensuche zu beschleunigen.

2 Komponenten und Arten von Indizes

Es gibt viele gängige Methoden zum Implementieren von Indizes, z. B. Hash, Array und Baum. Im Folgenden werden Ihnen die Unterschiede bei der Verwendung dieser Modelle vorgestellt.

2.1 Hash

Die Idee des Hashings ist einfach: Mithilfe des Hash-Funktionsalgorithmus wird der entsprechende Wert des von uns eingefügten Schlüssels berechnet (in der Vergangenheit wurde normalerweise der Rest verwendet, genau wie bei der Berechnungsmethode Hashmap, Shift XOR usw.). .) und platzieren Sie diesen Wert an einer Position. Dieser Ort wird als Hash-Slot bezeichnet. Der entsprechende Festplattenspeicherortzeiger wird im Hash-Slot platziert. Um es in einem Satz zusammenzufassen: Ein Hash-Index speichert den Hash-Wert des Indexfelds und den Dateizeiger auf der Festplatte, auf dem sich die Daten befinden.

Es ist jedoch unvermeidlich, dass unabhängig vom Algorithmus bei großen Datenmengen zwangsläufig unterschiedliche Daten im selben Hash-Slot abgelegt werden. Beispielsweise haben „Wu“ und „武“ im Wörterbuch die gleiche Aussprache. Wenn Sie im Wörterbuch nachschlagen, können Sie nur in der Reihenfolge nach unten gehen. Das Gleiche gilt für die Indexverarbeitung. Bei Bedarf wird eine verknüpfte Liste herausgezogen und nacheinander durchlaufen.

  • Nachteile: Ungeordneter Index, die Leistung der Intervallabfrage ist gering, da die Intervallabfrage mehrere Festplattenzugriffe verursacht und mehrere E/A zeitaufwändig sind, was schwer zu akzeptieren ist.
  • Vorteile: Das Einfügen geht schnell, Sie müssen es erst später hinzufügen.
  • Szenario: Äquivalente Abfrage, z. B. memcached. Nicht geeignet für Spalten mit großen Mengen wiederholter Daten, um Hash-Konflikte zu vermeiden
  • Zusammenfassung: Betrachten Sie es als eine Java-Hashmap

2.2 Geordnetes Array

Wenn wir eine Intervallabfrage benötigen, ist die Leistung des Hash-Index nicht zufriedenstellend. Zu diesem Zeitpunkt können die Vorteile geordneter Arrays berücksichtigt werden.

Wenn wir den Wert zwischen A und B aus einem geordneten Array ermitteln müssen, müssen wir nur die Position von A mithilfe der Dichotomiemethode lokalisieren, die zeitliche Komplexität beträgt O (log (N)) und dann von A nach B durchlaufen. Von der Geschwindigkeit her kann man grundsätzlich sagen, dass es das Schnellste ist. Aber wenn wir ein Update durchführen müssen, müssen viele Vorgänge ausgeführt werden. Wenn Sie ein Datenelement einfügen müssen, müssen Sie alle Daten nach den Daten verschieben, was eine Leistungsverschwendung darstellt. Zusammenfassend lässt sich sagen, dass nur Daten, die sich nicht sehr stark ändern, für die Indizierung in eine geordnete Array-Struktur geeignet sind.

  • Nachteile: Beim Einfügen neuer Daten müssen alle nachfolgenden Daten geändert werden, was etwas teurer ist.
  • Vorteile: Die Abfragegeschwindigkeit ist sehr hoch, theoretisch maximal.
  • Szenario: Archivabfrage, Protokollabfrage usw., die sich selten ändern
  • Zusammenfassung: Es handelt sich um ein in der Reihenfolge angeordnetes Array

2.3 Binärer Suchbaum

Das Grundprinzip besteht darin, dass die linken Knoten des Baums kleiner als der übergeordnete Knoten und die rechten Knoten größer als der übergeordnete Knoten sind.

Hier können wir sehen, dass die Abfrageeffizienz eines binären Suchbaums im Prinzip O(log(N)) ist. Um einen ausgeglichenen Binärbaum sicherzustellen, beträgt die Aktualisierungseffizienz ebenfalls O(log(N)). Wenn jedoch viele Daten vorhanden sind, erreicht der Baum eine sehr hohe Höhe und es ist nicht ratsam, zu oft auf die Festplatte zuzugreifen. Und im Extremfall degeneriert der Baum zu einer verknüpften Liste und die Abfragekomplexität wird auf O(n) reduziert.

Bei der Entwicklung zu einem Multi-Fork-Baum, d. h. wenn es mehrere untergeordnete Knoten gibt, wird die Höhe des Baums stark reduziert und der Zugriff auf die Festplatte wird eingeschränkt.

  • Nachteile: Wenn die Datenmenge groß ist, ist der Baum zu hoch, was zu mehreren Festplattenzugriffen führt.
  • Vorteile: Durch die Weiterentwicklung zu einem Multi-Fork-Baum werden die Baumhöhe und die Anzahl der Festplattenzugriffe reduziert.
  • Szenario: Anwendbar auf viele Szenarien
  • Zusammenfassung: Der Baum ist links klein und rechts groß

2.4 B-Baum

Speichern Sie in jedem Knoten mehrere Elemente und in jedem Knoten so viele Daten wie möglich. Jeder Knoten kann 1000 Indizes speichern (16k/16=1000), wodurch der Binärbaum in einen Baum mit mehreren Gabeln umgewandelt wird. Durch Erhöhen des Gabelbaums des Baums wird der Baum von hoch und dünn zu kurz und fett geändert. Um 1 Million Daten zu erstellen, benötigt die Höhe des Baums nur 2 Ebenen (1000 * 1000 = 1 Million), was bedeutet, dass nur 2 Festplatten-IOs zum Abfragen der Daten erforderlich sind. Die Anzahl der Festplatten-IOs wird reduziert und die Effizienz der Datenabfrage verbessert.

Diese Datenstruktur wird als B-Baum bezeichnet. Der B-Baum ist ein ausgewogener Suchbaum mit mehreren Zweigen.

2,5 B+ Baum

Der Hauptunterschied zwischen B+-Baum und B-Baum besteht darin, ob Nicht-Blattknoten Daten speichern.

  • B-Baum: Sowohl Nicht-Blattknoten als auch Blattknoten speichern Daten.
  • B+-Baum: Nur Blattknoten speichern Daten und Nicht-Blattknoten speichern Schlüsselwerte. Blattknoten werden mithilfe bidirektionaler Zeiger verbunden, und die untersten Blattknoten bilden eine bidirektional geordnete verknüpfte Liste.

Gerade weil die Blattknoten des B+-Baums durch verknüpfte Listen verbunden sind, können Intervallabfragen nach dem Finden der Untergrenze schnell durchgeführt werden, was schneller ist als das normale Durchlaufen in der Reihenfolge.

3 Indexpflege

Wenn Sie ein Datenelement einfügen, muss der Index die erforderlichen Vorgänge ausführen, um die Reihenfolge der Daten sicherzustellen. Im Allgemeinen können die sich selbst erhöhenden Daten direkt am Ende hinzugefügt werden. In besonderen Fällen, wenn die Daten in der Mitte hinzugefügt werden, müssen alle nachfolgenden Daten verschoben werden, was sich auf die Effizienz auswirkt.

Im schlimmsten Fall, wenn die aktuelle Datenseite (eine Seite ist die kleinste Einheit des MySQL-Speichers) voll ist, müssen Sie eine neue Datenseite beantragen. Dieser Vorgang wird als Seitenteilung bezeichnet. Wenn Seitenteilungen auftreten, wird die Leistung beeinträchtigt. Aber MySQL ist keine hirnlose Datenaufteilung. Wenn Sie die Daten in der Mitte aufteilen, wird die Hälfte der Leistung für den automatisch inkrementierenden Primärschlüssel verschwendet. MySQL bestimmt die Aufteilungsmethode basierend auf dem Typ Ihres Index und der Verfolgung der eingefügten Daten. Im Allgemeinen werden sie im Kopf der MySQL-Datenseite gespeichert. Wenn es sich um eine verstreute Einfügung handelt, wird sie in der Mitte geteilt. Wenn es sequentiell eingefügt wird, wird es normalerweise dadurch verursacht, dass der Einfügepunkt ausgewählt wird, um mit der Teilung zu beginnen, oder einige Zeilen nach dem Einfügepunkt. Entscheiden Sie, ob Sie in der Mitte oder am Ende teilen möchten.

Wenn unregelmäßige Daten eingefügt werden und es keine Garantie dafür gibt, dass der letztere Wert größer als der vorherige ist, wird die oben erwähnte Aufteilungslogik ausgelöst und schließlich wird der folgende Effekt erzielt.

Daher müssen wir in den meisten Fällen automatisch wachsende Indizes verwenden, es sei denn, das Unternehmen muss den Primärschlüssel anpassen. Es ist am besten, sicherzustellen, dass nur ein Index vorhanden ist und dieser Index ein eindeutiger Index ist. Dadurch wird vermieden, dass die Tabelle gesichert wird, was dazu führt, dass die Abfrage zwei Bäume durchsucht. Stellen Sie die Ordnung der Datenseiten sicher und nutzen Sie Indizes besser.

4 Antwort

Für Laien ausgedrückt: Wenn sich die Indexspalte in der von select erforderlichen Spalte befindet (da der Index in MySQL nach dem Wert der Indexspalte sortiert ist, sind einige Werte in der Spalte im Indexknoten vorhanden) oder auf einem Index basiert query Es ist nicht erforderlich, die Tabelle zurückzugeben, wenn Sie den Datensatz erhalten können. Wenn in den für die Auswahl erforderlichen Spalten eine große Anzahl von Nicht-Index-Spalten vorhanden ist, muss der Index zuerst den Primärschlüssel und dann den entsprechenden finden Spalteninformationen in der Tabelle, die als Tabellenrückgabe bezeichnet werden.

Um die hintere Tabelle einzuführen, müssen wir natürlich Clustered-Indizes und Nicht-Cluster-Indizes einführen.
Die Blattknoten des InnoDB-Clustered-Index speichern Zeilendatensätze. Daher darf InnoDB nur einen Clustered-Index haben:

  • Wenn die Tabelle einen Primärschlüssel definiert, ist PK der Clustered-Index;
  • Wenn die Tabelle keinen Primärschlüssel definiert, ist die erste Spalte mit einem eindeutigen Index ungleich Null (nicht NULL eindeutig) ein Clustered-Index.
  • Andernfalls erstellt InnoDB eine versteckte Zeilen-ID als Clustered-Index.

Wenn wir die gewöhnliche Indexabfragemethode verwenden, müssen wir zuerst den gewöhnlichen Indexbaum durchsuchen, dann die Primärschlüssel-ID abrufen und dann erneut im ID-Indexbaum suchen. Weil der Blattknoten des Nicht-Primärschlüsselindex tatsächlich die ID des Primärschlüssels speichert. Obwohl dieser Prozess einen Index verwendet, führt die unterste Ebene tatsächlich zwei Indexabfragen aus. Dieser Prozess wird als Tabellenrückgabe bezeichnet. Mit anderen Worten: Abfragen, die auf Nicht-Primärschlüssel-Indizes basieren, müssen einen weiteren Indexbaum durchsuchen. Daher sollten wir versuchen, in unseren Anwendungen Primärschlüsselabfragen zu verwenden. Oder richten Sie bei häufigen Anfragen sinnvollerweise einen gemeinsamen Index ein, um Tabellenrückgaben zu verhindern.

5 Indexabdeckung

In einem Satz können alle von SQL benötigten Spaltendaten aus nur einem Indexbaum abgerufen werden, ohne dass eine Rückkehr zur Tabelle erforderlich ist, und die Geschwindigkeit ist höher. Bei Implementierung in SQL kann die Indexabdeckung ausgelöst werden, solange das Feld „Extra“ des Ausgabeergebnisses im Ausführungsplan „Index verwenden“ lautet.

Die gängige Optimierungsmethode ist die oben erwähnte, bei der alle Abfragefelder in den Index integriert werden. Ob der DBA bereit ist, Sie den Index erstellen zu lassen, müssen Sie selbst ausfechten.

Zu den anwendbaren Szenarien für die allgemeine Indexabdeckung gehören die Optimierung der vollständigen Tabellenanzahl, die Rückgabe von Spaltenabfragetabellen und die Rückgabe von Paging-Tabellen. Höhere Versionen von MySQL wurden optimiert. Wenn eines der Felder im gemeinsamen Index getroffen wird und das andere eine ID ist, wird es automatisch optimiert, ohne die Tabelle zurückzugeben. Da der Primärschlüssel auf den Blättern des Sekundärindexes gespeichert wird, gilt er auch als Indexabdeckung und erfordert keine zusätzlichen Kosten.

6 Leftmost-Matching-Prinzip

Vereinfacht ausgedrückt: Wenn Sie „xx%“ verwenden, wird der Index auch verwendet, wenn die Bedingungen erfüllt sind.
Wenn es sich um einen gemeinsamen Index handelt, möchte ich Ihnen ein Beispiel geben: Erstellen Sie einen gemeinsamen Index von (a, b).

Sie können sehen, dass der Wert von a in der Reihenfolge 1, 1, 2, 2, 3, 3 liegt, während der Wert von b 1, 2, 1, 4, 1, 2 in keiner Reihenfolge ist. Wir können aber auch feststellen, dass bei gleichem Wert von a die b-Werte in der richtigen Reihenfolge angeordnet sind, diese Reihenfolge jedoch relativ ist. Dies liegt daran, dass die MySQL-Regel zum Erstellen eines gemeinsamen Index darin besteht, zuerst das Feld ganz links im gemeinsamen Index basierend auf der Sortierung des ersten Felds und dann das zweite Feld zu sortieren. Daher gibt es keine Möglichkeit, den Index für Abfragebedingungen wie b=2 zu verwenden. Zum Beispiel erstelle ich mit BTREE einen Index,
KEY ( , ) , um den ersten vollständigen SQL-Tabellenscan auszuführen idx_time_zone time_zonetime_string

Wenn Sie die zweite SQL ausführen, können Sie sehen, dass der Index verwendet wird.

Wenn wir uns die beiden SQLs noch einmal ansehen, ist der erstellte Index KEY ( , ) USING BTREE idx_time_zone time_zonetime_string

Nach normaler Logik entspricht die zweite SQL nicht der Reihenfolge der Indexfelder und der Index sollte nicht verwendet werden. Die tatsächliche Situation unterscheidet sich jedoch von unseren Erwartungen. Warum ist das so?

Seit der Übernahme von MySQL durch Oracle hat MySQL viele der früheren Technologien von Oracle integriert. Höhere Versionen von MySQL optimieren automatisch die Reihenfolge der Where-Bedingungen. Um es einfach auszudrücken: Der Abfrageoptimierer führt diesen Schritt aus, SQL führt die Vorverarbeitung durch und welche Regel wird für eine bessere Abfrage verwendet.

Lassen Sie mich übrigens einige Dinge erwähnen, bei denen der Abfrageoptimierer von MySQL helfen kann.

6.1 Bedingte Transformation

Wenn beispielsweise a=b und b=2 ist, können Sie eine bedingte Übertragung a=2 erhalten. Die endgültige SQL ist a=2 und b=2 > < = kann übergeben werden

6.2 Ausschluss ungültiger Codes

Wenn zum Beispiel 1=1 und a=2 ist, ist 1=1 immer richtig, also wird es am Ende auf a=2 optimiert.
Wenn zum Beispiel 1=0 immer falsch ist. Dies wird ebenfalls ausgeschlossen, und Die gesamte SQL wird ungültig
oder illegal sein. Leere Felder, in denen a null ist, werden ebenfalls ausgeschlossen.

6.3 Berechnen Sie im Voraus

Der Teil, der mathematische Operationen enthält, z. B. wo a= 1+2, hilft Ihnen bei der Berechnung, wo a=3

6.4 Zugriffsarten

Wenn wir einen bedingten Ausdruck auswerten, bestimmt MySQL den Zugriffstyp des Ausdrucks. Hier sind einige Zugriffstypen, geordnet vom besten zum schlechtesten:

  • Systemsystemtabelle und ist eine konstante Tabelle
  • const Konstantentabelle
  • eq_ref eindeutiger/primärer Index und verwendet „=“ für den Zugriff
  • Der Referenzindex verwendet „=“ für den Zugriff
  • Der ref_or_null-Index verwendet „=“ für den Zugriff und kann NULL sein
  • Der Bereichsindex verwendet BETWEEN, IN, >=, LIKE usw. für den Zugriff
  • Index-Index-Vollscan
  • Vollständiger Scan ALLER Tabellen

Wenn Sie sich den Ausführungsplan oft ansehen, können Sie auf einen Blick erkennen, was er bedeutet. Hier ein Beispiel.

wobei index_col=2 und normal_col =3 index_col=2 als Treiberelement ausgewählt werden. Die Bedeutung des Treiberelements besteht darin, dass es bei der Auswahl eines SQL-Ausführungsplans mehrere Ausführungspfade geben kann. Einer ist ein vollständiger Tabellenscan und wird dann gefiltert, um festzustellen, ob er mit den Werten von Indexfeldern und Nicht-Feldern übereinstimmt. Indexfelder. Die andere besteht darin, den entsprechenden Indexbaum über das Indexfeld zu finden, Schlüsselwert = 2, das Ergebnis zu filtern und dann zu vergleichen, ob es mit dem Wert des Nicht-Indexfelds übereinstimmt. Unter normalen Umständen erfordert die Indizierung weniger Lesevorgänge auf der Festplatte als das Scannen einer vollständigen Tabelle. Daher wird sie als besserer Ausführungspfad bezeichnet, bei dem das Indexfeld als treibender Ausdruck verwendet wird

6.5 Reichweitenzugang

Einfach ausgedrückt ist a in(1,2,3) dasselbe wie a=1 oder a=2 oder a=3, und zwischen 1 und 2 ist es auch dasselbe wie a>1 und a<2. Es besteht keine Notwendigkeit optimieren.

6.6 Indexzugriffsarten

Vermeiden Sie die Verwendung von Indizes mit demselben Präfix, d. h. ein Feld sollte nicht in mehreren Indizes dasselbe Präfix haben. Wenn beispielsweise ein eindeutiger Index für ein Feld eingerichtet wurde und Sie zu diesem Zeitpunkt einen gemeinsamen Index dafür erstellen, weiß der Optimierer nicht, welchen Index Sie verwenden möchten. Wenn Sie einen einzelnen Index und einen gemeinsamen Index mit demselben Präfix erstellen, wird der gemeinsame Index möglicherweise nicht verwendet, selbst wenn Sie die Bedingungen schreiben. Natürlich kann man es erzwingen, aber das ist eine andere Geschichte.

6.7 Konvertierung

Einfache Ausdrücke können konvertiert werden, z. B. „where -2 = a“ wird automatisch in „where a= -2“ umgewandelt. Wenn jedoch mathematische Operationen beteiligt sind, können sie nicht konvertiert werden, z. B. „where 2= -a“ wird nicht automatisch in „where a at“ konvertiert Diesmal. =-2.

Die zweite SQL kann den Index verwenden

Daher müssen wir während des Entwicklungsprozesses darauf achten, wie SQL geschrieben wird, und bewusst schreiben, wo a = -2 ist

6.8 und、vereinigung、ordnen nach、gruppieren nach等

1)und

Wenn nach der Bedingung und kein Index vorhanden ist, scannen Sie die gesamte Tabelle. Es gibt einen besseren Zugriffstyp. Siehe 5.4. Der Index mit einem besseren Speichertyp wird verwendet. Wenn beide gleich sind, wird welcher Index zuerst erstellt und welcher verwendet.

2)Gewerkschaft

Jede Gewerkschaftsaussage wird individuell optimiert

Hier werden zwei SQLs separat ausgeführt, wobei der Index verwendet und anschließend die Ergebnismengen zusammengeführt werden.

3)Sortieren nach

Sortieren nach filtert ungültige Sortierungen heraus, z. B. ein Feld, das bereits über einen Index verfügt.

Der Abfrageeffekt des zweiten SQL ist der gleiche wie der erste

Schreiben Sie daher beim Schreiben von SQL keine unnötige Sortierung, z. B. die Reihenfolge nach „xxx“, die bedeutungslos ist.

4)gruppieren nach

Um es einfach auszudrücken: Wenn für Felder vom Typ „Gruppieren nach“ ein Index vorhanden ist, wird der Index verwendet. Für das Gruppieren nach „Reihenfolge nach a“ bedeutet „Reihenfolge nach“, dass „Reihenfolge nach“ nicht geschrieben wird. Die Ergebnismenge ist bereits sortiert. Bitte beachten Sie 6.8-3. Bestellen Sie, indem Sie
eine bestimmte Spalte aus Tabelle a usw. auswählen. Preis bei Auswahl einer bestimmten Spalte aus einer Gruppe nach Spalte a

7 Index-Pushdown

Der Hauptpunkt besteht darin, den Datenfilterprozess zur Verarbeitung auf die Speicher-Engine-Ebene zu verlagern, anstatt ihn wie bisher zur Filterung auf die Serverebene zu verlagern.

Wenn sowohl der Name als auch das Alter in einer Tabelle indiziert sind, lautet die Abfragebedingung, dass der Name „xx%“ und das Alter = 11 sind. In niedrigeren Versionen von MySQL (unter 5.6) können Sie nach dem am weitesten links stehenden Übereinstimmungsprinzip des Index erhalten Filtern Sie die Daten mit zunehmendem Alter nur nach Namen. Nachdem Sie alle IDs basierend auf dem Namen erhalten haben, kehren Sie zur Tabelle basierend auf den IDs zurück.

In der höheren Version von MySQL wird das Altersattribut nicht ignoriert. Durch das Filtern mit dem Altersattribut werden Daten mit einem Alter von 11 direkt herausgefiltert. Angenommen, es gibt 10 Datenelemente, die nicht nach dem Alter gefiltert werden. Nach dem Filtern sind es nur noch 3 Artikel übrig, was 7 Antworten weniger bedeutet. Oberfläche. Durch die Reduzierung von io wird der Leistungsverbrauch erheblich reduziert

8 Kleine Tische treiben große Tische an

Wir sind es gewohnt, das Sprichwort zu hören, dass eine kleine Tabelle eine große Tabelle steuert. Dies bedeutet hauptsächlich, dass der Datensatz einer kleinen Tabelle den Datensatz einer großen Tabelle steuert, wodurch die Anzahl der Verbindungen verringert wird. Zum Beispiel:

Tabelle A verfügt über 10.000 Daten und Tabelle B über 1.000.000 Daten. Wenn Tabelle A als Treibertabelle verwendet wird und sich in der äußeren Schicht der Schleife befindet, sind nur 10.000 Verbindungen erforderlich. Wenn sich Tabelle B in der äußeren Ebene befindet, muss sie 1 Million Mal wiederholt werden.

Werfen wir einen Blick auf den eigentlichen Test und bereiten Sie die Umgebung von MySQL 5.7+ vor

Bereiten Sie zwei Tabellen vor, eine Tabelle mit den Daten ib_asn_d 9175 und eine Tabelle mit den Daten bs_itembase_ext_attr 1584115. Beide haben Indizes für das Produktcodefeld.

Erstens treibt der kleine Tisch den großen Tisch an

Bei wiederholten Tests beträgt die Ausführungszeit etwa 7 Sekunden.
Schauen wir uns als Nächstes den großen Tisch an, der den kleinen Tisch antreibt.

Fast 300 Sekunden sind nicht so groß.
Analysieren Sie als Nächstes den Ausführungsplan separat. Das erste Element im Ausführungsplan ist die Treibertabelle.

Die kleine Tabelle steuert die große Tabelle. Die große Tabelle verwendet Indizes. Die kleine Tabelle scannt die gesamte Tabelle und scannt nur mehr als 8.000 Zeilen.

Die große Tabelle steuert die kleine Tabelle, und ein vollständiger Tabellenscan der großen Tabelle erfordert das Scannen von 1.470.000 Zeilen.
Nach vielen Tests kamen wir zu dem Schluss:

  1. Bei Verwendung der linken Verknüpfung ist die linke Tabelle die treibende Tabelle und die rechte Tabelle die getriebene Tabelle.
  2. Bei Verwendung der rechten Verknüpfung ist die rechte Tabelle die treibende Tabelle und die linke Tabelle die getriebene Tabelle.
  3. Bei Verwendung von Inner Join wählt MySQL eine Tabelle mit einer relativ kleinen Datenmenge als treibende Tabelle und eine große Tabelle als treibende Tabelle aus.
  4. Der Treibertabellenindex wird nicht wirksam, der Nicht-Laufwerkstabellenindex jedoch.

Es ist darauf zu achten, dass es sich bei dem kleinen Tisch um einen Fahrtisch handelt.

9 Zusammenfassung

  1. Deckungsindex: Wenn die Abfragebedingung einen normalen Index (oder das Hauptfeld ganz links im gemeinsamen Index) verwendet, ist das Abfrageergebnis das Feld oder der Primärschlüssel des gemeinsamen Index, und das Ergebnis wird ohne Tabellenrückgabeoperation direkt zurückgegeben, was zu einer Reduzierung führt Lesen und Schreiben der E/A-Festplatte. Die gesamte Datenzeile ist erforderlich, sodass ein gemeinsamer Index für Hochfrequenzfelder erstellt werden muss
  2. Präfix ganz links: die N Felder ganz links des gemeinsamen Index oder die M Zeichen ganz links des Zeichenfolgenindex. Achten Sie beim Erstellen eines Index darauf, das linke Präfix nicht zu wiederholen, um zu verhindern, dass der Abfrageoptimierer nicht ermitteln kann, wie der Index verwendet werden soll.
  3. Index-Pushdown: Name wie „Hallo %“ und Alter > 10 Abruf, vor MySQL-Version 5.6 werden die übereinstimmenden Daten zurück in die Tabelle abgefragt. Nach Version 5.6 werden Daten mit einem Alter <10 Jahren zuerst herausgefiltert und dann zur Abfrage an die Tabelle zurückgegeben, wodurch die Tabellenrückgaberate verringert und die Abrufgeschwindigkeit verbessert wird.

Autor: JD Logistics Wu Siwei 
Quelle: JD Cloud Developer Community Bitte geben Sie beim Nachdruck die Quelle an

IntelliJ IDEA 2023.3 & JetBrains Family Bucket jährliches Hauptversions-Update neues Konzept „defensive Programmierung“: Machen Sie sich einen stabilen Job GitHub.com betreibt mehr als 1.200 MySQL-Hosts, wie kann man nahtlos auf 8.0 aktualisieren? Das Web3-Team von Stephen Chow wird nächsten Monat eine unabhängige App starten. Wird Firefox eliminiert? Visual Studio Code 1.85 veröffentlicht, schwebendes Fenster Yu Chengdong: Huawei wird nächstes Jahr bahnbrechende Produkte auf den Markt bringen und die Geschichte der Branche neu schreiben. Die US-amerikanische CISA empfiehlt den Verzicht auf C/C++, um Schwachstellen in der Speichersicherheit zu beseitigen. TIOBE Dezember: C# soll zur Programmierung werden Sprache des Jahres. Ein von Lei Jun vor 30 Jahren verfasster Artikel: „Prinzip und Design des Expertensystems zur Computervirenbestimmung“
{{o.name}}
{{m.name}}

Supongo que te gusta

Origin my.oschina.net/u/4090830/blog/10320986
Recomendado
Clasificación