MySQL (1) -grundkenntnisse der SQL-Optimierung

Referenz: "MySQL Technical Insider InnoDB Storage Engine Version 2",

Eine, logische MySQL-Struktur

image-20210329105217103

Die Architektur von MySQL kann grob in zwei Teile unterteilt werden: Serverschicht und Speicher-Engine-Schicht:

  • Serverschicht: Einschließlich Konnektoren, Abfragecaches, Analysatoren, Optimierer, Ausführende und die meisten Kerndienste von MySQL sowie alle integrierten Funktionen
  • Speicher-Engine-Schicht: Verantwortlich für die Datenspeicherung und -extraktion. Das Architekturmodell ist im Plug-In-Stil. Ab Mysql5.5 ist InnoDB die Standard-Speicher-Engine

Die Komponenten, die sich auf die Serverschicht beziehen, werden nachfolgend vorgestellt:

  • Connector: Verantwortlich für die Verwaltung von Verbindungen und die Authentifizierungsauthentifizierung. Beispielsweise ist die Autorisierung zwischen dem Administratorkonto und dem normalen Konto unterschiedlich
  • Abfragecache: MySQL wird zuerst in den Abfragecache aufgenommen, wenn eine Abfrageoperation ausgeführt wird, um festzustellen, ob die Anweisung zuvor ausgeführt wurde. Der Abfragecache wird jedoch im Allgemeinen nicht empfohlen, da der Cache in der Tabelle jedes Mal ungültig ist, wenn eine Tabelle aktualisiert wird Diese Funktion wurde seit mysql8.0 abgebrochen
  • Parser: Der Parser führt eine grammatikalische Analyse durch, wenn die Arbeit ausgeführt werden muss, um festzustellen, um welche Operation es sich bei dem Satz handelt
  • Optimierer: Weiß MySQL nach dem Analysator, was die Anweisung bewirkt? Der Optimierer entscheidet, welcher Index oder andere Optimierungsoperationen verwendet werden sollen, wenn die Tabelle mehrere Indizes enthält
  • Ausführender: MySQL weiß, was über den Analysator und über den Optimierer zu tun ist. Dann müssen Sie die Anweisung tatsächlich ausführen und mit der Speicher-Engine interagieren

Die obige Sequenz dient eigentlich dazu, eine Abfrageanweisung auszuführen. Was MySQL tut, ist wie eine Pipeline.

2. Vergleich mehrerer gängiger Speicher-Engines

  • InnoDB: Die InnoDB-Speicher-Engine ist die Standard-Speicher-Engine von MySQL. Die InnoDB-Speicher-Engine bietet Transaktionssicherheit mit Funktionen zum Festschreiben, Zurücksetzen und zur Wiederherstellung nach einem Absturz. Im Vergleich zur Speicher-Engine von MyISAM sind InnoDB-Schreibvorgänge jedoch weniger effizient und benötigen mehr Speicherplatz, um Daten und Indizes zu speichern.
  • MyISAM: MyISAM unterstützt weder Transaktionen noch Fremdschlüssel. Der Vorteil besteht darin, dass es eine schnelle Zugriffsgeschwindigkeit bietet und keine Transaktionsintegrität erfordert oder Anwendungen, die auf SELECT und INSERT basieren, diese Engine grundsätzlich zum Erstellen von Tabellen verwenden können.
  • SPEICHER: Die Speicher-Engine speichert Tabellendaten im Speicher. Jede MEMORY-Tabelle entspricht tatsächlich einer Festplattendatei, das Format ist .frm, die Datei speichert nur die Struktur der Tabelle und ihre Datendateien werden im Speicher gespeichert, was der schnellen Verarbeitung von Daten förderlich ist und die Effizienz von verbessert der gesamte Tisch. Der Tabellenzugriff vom Typ MEMORY ist sehr schnell, da seine Daten im Speicher gespeichert sind und der HASH-Index standardmäßig verwendet wird. Sobald der Dienst geschlossen wird, gehen die Daten in der Tabelle jedoch verloren
  • MERGE: Die MERGE-Speicher-Engine ist eine Kombination aus einer Reihe von MyISAM-Tabellen. Diese MyISAM-Tabellen müssen genau dieselbe Struktur haben. Die MERGE-Tabelle selbst speichert keine Daten. Sie können Abfrage-, Aktualisierungs- und Löschvorgänge für MERGE-Tabellen ausführen Operationen sind tatsächlich intern Die MyISAM-Tabelle wird ausgeführt.

Vergleich zwischen InnoDB und MyISAM:

  • InnoDB ist derzeit die Standardspeicher-Engine, und MyISAM steht vor mysql5
  • In Bezug auf Transaktionen unterstützt InnoDB Transaktionen, während MyISAM keine Transaktionen unterstützt. Es ist unangenehm, MyISAM nach einem Systemabsturz wiederherzustellen
  • In Bezug auf Sperren ist InnoDB eine Sperre auf Zeilenebene, während MyISAM Tabellensperren unterstützt, sodass die Effizienz von InoDB in Bezug auf die Effizienz besser ist
  • In Bezug auf Fremdschlüssel unterstützt InnoDB Fremdschlüssel, während MyISAM keine Fremdschlüssel unterstützt
  • In Bezug auf Cluster-Indizes werden B + -Nummern als Indizes verwendet, aber MyISAM-Indizes und -Dateien werden getrennt, und InnoDB-Indizes und -Daten werden miteinander verbunden, sodass InnoDB einen Primärschlüssel haben muss. Wenn kein Primärschlüssel vorhanden ist, wird einer als ausgewählt Primärschlüssel

Drei, Index

1. Was ist ein Index?

Einfach ausgedrückt ist ein Index eine Datenstruktur. Der Index soll beim Aufbau der Datenbank helfen. Der MySQL-Index ist für den effizienten Betrieb von MySQL sehr wichtig, und der Index kann die Abrufgeschwindigkeit von MySQL erheblich verbessern. Zusätzlich zu den Daten verwaltet das Datenbanksystem auch Datenstrukturen, die bestimmten Suchalgorithmen entsprechen. Diese Datenstrukturen verweisen auf bestimmte Weise auf Daten (zeigen auf diese), so dass erweiterte Suchalgorithmen auf diesen Datenstrukturen implementiert werden können Index.

2. Index und B + Baum

Erinnern Sie sich an Beispiele im Leben, wie das Nachschlagen des Wörterbuchs, das Nachschlagen des Wortes mysql, suchen Sie zuerst m und suchen Sie dann in der richtigen Reihenfolge. Wenn Sie die sequentielle Suche nach den 26 Buchstaben az verwenden, müssen Sie 13 suchen Wenn Sie die binäre Suche verwenden, können Sie sie in kurzer Zeit finden, aber wir suchen tatsächlich nach dem Wort mysql. Durchsuchen wir den Index und suchen schnell die Position von m durch den Index, dann wenn Wir verwenden einen Mehrwege-Suchbaum. Ist das nicht noch schneller? Der Katalog der Bücher, der Zugfahrplan des Bahnhofs usw. werden verwendet, um die Endergebnisse zu filtern, indem der Umfang der Zieldaten ständig eingeschränkt wird.

Die Datenbank ist auch dieselbe. Die meisten Datenbankoperationen sind Abfragen, aber die Daten in der Datenbank werden auf der Festplatte gespeichert. Nachdem Sie die Prinzipien der Computerzusammensetzung kennengelernt haben, können Sie verstehen, dass die Festplattenoperation sehr zeitaufwändig ist! Die Kosten für den Zugriff auf die Festplatte betragen etwa das 100.000-fache der Kosten für den Zugriff auf den Speicher! Daher können Sie für die Daten in der Datenbank den AVL-Baum nicht verwenden, da sein Ungleichgewicht zu einer großen Anzahl von Io-Operationen führen kann, was zu einem raschen Leistungsabfall führt. Zu diesem Zeitpunkt wird der B-Baum angezeigt (siehe Datenstruktur und Algorithmusanalyse Java-Sprachbeschreibung für Details Im Abschnitt von B-Baum) ist B + -Baum (eine Variante von B-Baum)Hochsteuerbarer Mehrweg-Suchbaum. Damit wird der Platten-Io-Baum bei der Suche nach Daten auf eine kleine Größenordnung gesteuert

3.B + Baum

Der Index in MySQL verwendet den B + -Baum. Der B + -Baum ist eine Variante des B-Baums. BTree wird auch als ausgeglichener Mehrweg-Suchbaum bezeichnet. Die Eigenschaften eines BTree mit m Gabeln sind wie folgt:

  • Jeder Knoten im Baum enthält höchstens m untergeordnete Knoten.
  • Mit Ausnahme des Wurzelknotens und der Blattknoten hat jeder Knoten mindestens [Ceil (m / 2)] untergeordnete Knoten.
  • Wenn der Wurzelknoten kein Blattknoten ist, hat er mindestens zwei untergeordnete Knoten.
  • Alle Blattknoten befinden sich in derselben Ebene.
  • Jeder Nicht-Blattknoten besteht aus n Schlüsseln und n + 1 Zeigern, wobei [Ceil (m / 2) -1] <= n <= m-1

B + Baum

B + Tree ist eine Variante von BTree. Der Unterschied zwischen B + Tree und BTree ist:

1) Der n-Gabel-B + -Baum enthält höchstens n Schlüssel, und der BTree enthält höchstens n-1 Schlüssel.

2) Die Blattknoten von B + Tree speichern alle Schlüsselinformationen in der Reihenfolge der Schlüsselgröße.

3) Alle Nicht-Blattknoten können als Indexteil des Schlüssels betrachtet werden.

4. B + Baum in MySQL

Referenz - Link

[Die Bildübertragung für externe Links ist fehlgeschlagen. Die Quellwebsite verfügt möglicherweise über einen Anti-Hotlinking-Mechanismus. Es wird empfohlen, das Bild zu speichern und direkt hochzuladen (img-2mCf0b9S-1616994232027) (C: \ Benutzer \ VSUS \ Desktop \ Notes \ MySQL \ sqlimage \ 03.jpg)]

Wie in der obigen Abbildung gezeigt, handelt es sich um einen b + -Baum. Der hellblaue Block wird als Plattenblock bezeichnet. Sie können sehen, dass jeder Plattenblock mehrere Datenelemente (dunkelblau dargestellt) und Zeiger (gelb dargestellt) enthält, z Block 1 enthält Datenelemente 17 und 35, einschließlich der Zeiger P1, P2, P3. P1 repräsentiert einen Plattenblock kleiner als 17, P2 repräsentiert einen Plattenblock zwischen 17 und 35 und P3 repräsentiert einen Plattenblock größer als 35. Die realen Daten existieren in den Blattknoten, nämlich 3, 5, 9, 10, 13, 15, 28, 29, 36, 60, 75, 79, 90, 99. Nicht-Blatt-Knoten speichern nur reale Daten, nur Datenelemente, die die Suchrichtung bestimmen. Beispielsweise sind 17 und 35 in der Datentabelle nicht wirklich vorhanden.

Der Suchvorgang von b + tree:

Wenn Sie, wie in der Abbildung gezeigt, das Datenelement 29 suchen möchten, laden Sie zuerst den Plattenblock 1 von der Platte in den Speicher. Zu diesem Zeitpunkt tritt eine E / A auf. Verwenden Sie die binäre Suche, um festzustellen, dass 29 zwischen 17 und 35 in der liegt Speicher und Sperren des Plattenblocks 1. Da die Speicherzeit (im Vergleich zu Platten-E / A) sehr kurz ist, ist die Speicherzeit vernachlässigbar. Der Plattenblock 3 wird über die Plattenadresse des P2-Zeigers der Platte von der Platte in den Speicher geladen Block 1, und die zweite E / A tritt auf, 29 in 26 und Zwischen 30, sperren Sie den P2-Zeiger von Plattenblock 3, laden Sie Plattenblock 8 über den Zeiger in den Speicher, und eine dritte E / A tritt auf. Gleichzeitig erfolgt eine binäre Suche wird im Speicher ausgeführt, um 29 zu finden, und die Abfrage endet und insgesamt drei E / A. Die reale Situation besteht darin, dass ein 3-Layer-B + -Baum Millionen von Daten darstellen kann. Wenn für Millionen von Datensuchen nur drei E / A erforderlich sind, ist die Leistungsverbesserung enorm. Wenn kein Index vorhanden ist, verfügt jedes Datenelement über eine E / A. Insgesamt sind Millionen von E / A erforderlich, was offensichtlich sehr teuer ist.

Viertens die Syntax des Index

4.1 Klassifizierung von Indizes

1) Einwertiger Index: Das heißt, ein Index enthält nur eine einzelne Spalte, und eine Tabelle kann mehrere einspaltige Indizes enthalten

2) Eindeutiger Index: Der Wert der Indexspalte muss eindeutig sein, es sind jedoch Nullwerte zulässig

3) Zusammengesetzter Index: Das heißt, ein Index enthält mehrere Spalten

4.2 Index erstellen

Grammatik:

CREATE 	[UNIQUE|FULLTEXT|SPATIAL]  INDEX index_name 
[USING  index_type]
ON tbl_name(index_col_name,...)


index_col_name : column_name[(length)][ASC | DESC]

Beispiel: Erstellen Sie einen einwertigen Index für das Namensfeld der Tabelle tb_seller:

mysql> create index idx_tb_seller_name on tb_seller(name);
4.3 Index anzeigen
show index from [table_name]

Beispiel: Zeigen Sie den oben erstellten Index an

show index from tb_seller;

[Die Bildübertragung für externe Links ist fehlgeschlagen. Die Quellwebsite verfügt möglicherweise über einen Anti-Hotlink-Mechanismus. Es wird empfohlen, das Bild zu speichern und direkt hochzuladen (img-cHbIC1qo-1616994232031) (C: \ Benutzer \ VSUS \ Desktop \ Notes \ MySQL \ sqlimage \ 04.png)]

Sie können sehen, dass es zwei Indizes gibt. Dies liegt daran, dass der Primärschlüssel beim Erstellen der Tabelle erstellt wird. Der Primärschlüssel wird standardmäßig als Index festgelegt. Sie können sehen, dass key_name PRIMARY und Non_unqiue 0 ist, was bedeutet dass dieses Feld nicht wiederholt werden kann und BTREE-Datenstruktur verwendet. (\ G dient zur besseren Erläuterung unter Linux)

  • Tabelle: Der Name der Tabelle, in der sich der Index befindet

  • Non_unique: Nicht eindeutiger Index, der Index des Primärschlüssels ist 0, da der Primärschlüssel nur eindeutig sein kann

  • Schlüsselname: Der Name des Index, der Index kann unter diesem Namen gelöscht werden

  • Seq_in_index: Die Position der Spalte im Index, z. B. der gemeinsame Index idx_a_c (a, c). Für Spalte a beträgt der Seq_in_index-Wert 1 und für Spalte c beträgt der Seq_in_index-Wert 2

  • Spaltenname: Spaltenname

  • Sortierung: Wie wird die Spalte im Index gespeichert? Der Index des B + -Baums ist immer A.

  • Kardinalität: Ein sehr kritischer Parameter, der die Anzahl der eindeutigen Werte im Index darstelltgeschätzter Wert, Dieser Wert sollte so nahe wie möglich an 1 liegen. Wenn er sehr klein ist, müssen Sie überlegen, ob dieser Index erstellt werden muss. Beispiel: Für das Feld "Geschlecht" kann das Ergebnis der Abfrage 50% der gesamten Tabelle betragen. Es ist nicht erforderlich, einen Index zu erstellen. Wenn das Namensfeld jedoch nicht in der gesamten Tabelle wiederholt wird, ist dies erforderlich Index erstellen. Dieser Wert wird verwendet, wenn der Index später ungültig wird

  • Sub_part: Gibt an, ob ein Teil der Spalte indiziert ist

  • Wie Schlüsselwörter komprimiert werden

  • Null: Ist es möglich, einen Nullwert zu haben?

  • Indextyp: Indextyp, Typ B + wird als BTREE angezeigt

  • Kommentar: Kommentar

4.4 Index löschen
drop index index_name on table_name;

Beispiel: Löschen Sie den oben erstellten Index

mysql> drop index idx_tb_seller_name on tb_seller;
4.4 Index löschen
drop index index_name on table_name;

Beispiel: Löschen Sie den oben erstellten Index

mysql> drop index idx_tb_seller_name on tb_seller;

Ich denke du magst

Origin blog.csdn.net/weixin_44706647/article/details/115298641
Empfohlen
Rangfolge