1. Wie MySQL Indizes verwendetIndizes werden verwendet, um schnell Zeilen mit bestimmten Spaltenwerten zu finden. Ohne Index muss MySQL mit der ersten Zeile beginnen und dann die gesamte Tabelle durchsuchen, um die relevanten Zeilen zu finden. Je größer der Tisch, desto mehr kostet er. Wenn die Tabelle über einen Index für die relevanten Spalten verfügt, kann MySQL schnell ermitteln, wo in der Mitte der Datendatei gesucht werden muss, ohne alle Daten durchsuchen zu müssen. Dies ist viel schneller, als jede Zeile nacheinander zu lesen. Die meisten MySQL-Indizes (PRIMARY KEY, UNIQUE, INDEX und FULLTEXT) werden in B-Bäumen gespeichert. Ausnahmen: Indizes für räumliche Datentypen verwenden R-Bäume; MEMORY-Tabellen unterstützen auch Hash-Indizes. InnoDB verwendet invertierte Listen für FULLTEXT-Indizes. MySQL verwendet Indizes für Folgendes:
Schließlich sind Indizes für Abfragen kleiner Tabellen weniger wichtig. Wenn eine Abfrage auf die meisten Zeilen zugreifen muss, sind sequentielle Lesevorgänge schneller als die Verarbeitung von Indizes. 2. Vermeiden Sie vollständige TabellenscansWenn MySQL zum Auflösen einer Abfrage einen vollständigen Tabellenscan verwendet, zeigt die Ausgabe von EXPLAIN „ALL“ in der Spalte „Typ“ an. Dies geschieht normalerweise, wenn:
Bei kleinen Tabellen ist ein Tabellenscan normalerweise angemessen und hat nur vernachlässigbare Auswirkungen auf die Leistung. Bei großen Tabellen können Sie die folgenden Techniken ausprobieren, um zu verhindern, dass der Optimierer fälschlicherweise einen Tabellenscan auswählt:
3. SpaltenindexDie B-Baum-Datenstruktur ermöglicht es Indizes, schnell einen bestimmten Wert, eine Menge von Werten oder einen Wertebereich zu finden, der Operatoren wie =, >, ≤, BETWEEN, IN usw. in einer WHERE-Klausel entspricht. Jede Speicher-Engine definiert die maximale Anzahl von Indizes und die maximale Indexlänge pro Tabelle. Alle Speicher-Engines unterstützen mindestens 16 Indizes pro Tabelle und die Gesamtindexlänge beträgt mindestens 256 Byte. IndexpräfixVerwenden Sie col_name(N), um einen Index zu erstellen, der nur die ersten N Zeichen einer Spalte verwendet. In InnoDB-Tabellen beträgt die maximale Präfixlänge 767 Bytes. VolltextindexFULLTEXT-Indizes werden für Volltextsuchen verwendet. FULLTEXT-Indizes werden nur für die Speicher-Engines InnoDB und MyISAM und nur für CHAR-, VARCHAR- und TEXT-Spalten unterstützt. Die Indizierung erfolgt immer für die gesamte Spalte; Spaltenpräfixindizes werden nicht unterstützt. Räumlicher IndexBezieht sich auf eine Datenstruktur, die basierend auf der Position und Form räumlicher Objekte oder einer bestimmten räumlichen Beziehung zwischen räumlichen Objekten in einer bestimmten Reihenfolge angeordnet ist. Indizes auf der Speicher-Engine MEMORYStandardmäßig verwendet die MEMORY-Speicher-Engine HASH-Indizes, unterstützt aber auch BTREE-Indizes. 4. Mehrspaltiger IndexMySQL kann zusammengesetzte Indizes erstellen (das heißt, Indizes für mehrere Spalten). Ein Index kann bis zu 16 Spalten enthalten. Angenommen, es gibt eine Darstellung, die wie folgt definiert ist: CREATE TABLE-Test ( id INT NICHT NULL, Nachname CHAR(30) NOT NULL, Vorname CHAR(30) NOT NULL, Primärschlüssel (ID), INDEX idx_name (Nachname,Vorname) ); Der idx_name-Index ist ein Index, der auf den Spalten last_name und first_name basiert. Dieser Index kann für Abfragen verwendet werden, die eine Kombination aus last_name- und first_name-Werten angeben, oder für Abfragen, die nur last_name-Werte angeben, da dieser Index mit dem Präfix ganz links übereinstimmt. Daher kann der idx_name-Index für die folgenden Abfragen verwendet werden: SELECT * FROM test WHERE Nachname='Jones'; SELECT * FROM test WHERE Nachname='Jones' AND Vorname='John'; SELECT * FROM test WHERE Nachname='Jones' AND (Vorname='John' OR Vorname='Jon'); SELECT * FROM test WHERE Nachname='Jones' AND Vorname >='M' AND Vorname < 'N'; Der idx_name-Index kann jedoch nicht für die folgenden Abfragen verwendet werden: SELECT * FROM test WHERE Vorname='John'; SELECT * FROM test WHERE Nachname='Jones' OR Vorname='John'; Betrachten Sie das folgende SQL: Wählen Sie * aus Tabellenname, wobei col1 = Wert1 und col2 = Wert2 ist. Wenn für col1 und col2 ein mehrspaltiger Index existiert, können die entsprechenden Zeilen direkt abgerufen werden. Wenn für Spalte1 und Spalte2 separate Einzelspaltenindizes vorhanden sind, versucht der Optimierer, die Indexzusammenführungsoptimierung zu verwenden oder den restriktivsten Index zu finden, indem er ermittelt, welcher Index mehr Zeilen ausschließen muss, und diesen Index zum Abrufen der Zeilen verwendet. Wenn die Tabelle einen mehrspaltigen Index hat, kann der Optimierer jedes ganz linke Präfix des Index verwenden, um Zeilen zu finden. Wenn Sie beispielsweise einen dreispaltigen Index (Spalte1, Spalte2, Spalte3) haben, dann verfügen Sie über Indexsuchfunktionen für (Spalte1), (Spalte1, Spalte2), (Spalte1, Spalte2, Spalte3). Wenn die Spalten kein äußerstes linkes Präfix des Index bilden, kann MySQL den Index nicht für die Suche verwenden. Sehen Sie sich die folgende SQL-Anweisung an: Wählen Sie * aus Tabellenname, wobei Spalte1 = Wert1 ist. Wählen Sie * aus Tabellenname, wobei col1 = Wert1 und col2 = Wert2 ist. Wählen Sie * aus Tabellenname, wobei col2 = val2; Wählen Sie * aus Tabellenname, wobei col2 = val2 und col3 = val3 ist; Wenn es einen zusammengesetzten Index für (Spalte1, Spalte2, Spalte3) gibt, wird dieser nur von den ersten beiden Abfragen verwendet. Dann verwenden die letzten beiden Abfragen den Index nicht zur Durchführung der Suche, da (col2) und (col2, col3) keine ganz linken Präfixe von (col1, col2, col3) sind. 5. Vergleich von B-Tree- und Hash-IndizesB-Tree-IndexeigenschaftenB-Baum-Indizes können für Spaltenvergleiche in Ausdrücken verwendet werden, die die Operatoren =, >, >=, <, <= und BETWEEN verwenden. Der Index kann auch für LIKE-Vergleiche verwendet werden, wenn das Argument für LIKE eine konstante Zeichenfolge ist, die nicht mit einem Platzhalterzeichen beginnt. Die folgenden Klauseln verwenden keine Indizes: /* der LIKE-Wert beginnt mit einem Platzhalterzeichen */ SELECT * FROM tbl_name WHERE key_col LIKE '%Patrick%'; /* der LIKE-Wert ist keine Konstante */ SELECT * FROM tbl_name WHERE Schlüsselspalte LIKE andere_Spalte; Jeder Index, der nicht alle UND-Ebenen in der WHERE-Klausel abdeckt, wird nicht zur Optimierung der Abfrage verwendet. Mit anderen Worten: Um einen Index verwenden zu können, muss in jeder UND-Gruppe ein Präfix des Index verwendet werden. Die folgenden WHERE-Klauseln verwenden Indizes: ... WO index_part1=1 UND index_part2=2 UND andere_Spalte=3 /* Index = 1 ODER Index = 2 */ ... WO index=1 ODER A=10 UND index=2 /* optimiert wie "index_part1='hello'" */ ... WO index_part1='hallo' UND index_part3=5 /* Kann Index auf Index1 verwenden, aber nicht auf Index2 oder Index3 */ ... WO index1=1 UND index2=2 ODER index1=3 UND index3=3; Die folgenden WHERE-Klauseln verwenden keine Indizes: /* index_part1 wird nicht verwendet */ ... WO index_part2=1 UND index_part3=2 /* Der Index wird in beiden Teilen der WHERE-Klausel nicht verwendet */ ... WO Index=1 ODER A=10 /* Kein Index erstreckt sich über alle Zeilen */ ... WO index_part1=1 ODER index_part2=10 Manchmal verwendet MySQL einen Index nicht, obwohl einer verfügbar ist. Ein möglicher Grund hierfür ist, dass der Optimierer schätzt, dass bei Verwendung des Indexes auf einen großen Prozentsatz der Zeilen in der Tabelle zugegriffen werden muss. (In diesem Fall ist ein Tabellenscan möglicherweise schneller, da weniger Suchvorgänge erforderlich sind.) Wenn eine solche Abfrage jedoch LIMIT verwendet, um nur bestimmte Zeilen abzurufen, verwendet MySQL dennoch den Index, da es die wenigen zurückzugebenden Zeilen schneller finden kann. Hash-Index-EigenschaftenHash-Indizes weisen einige andere Merkmale auf als die gerade besprochenen Indizes:
B-BaumBaumdatenstruktur, die häufig bei der Datenbankindizierung verwendet wird. Die Struktur bleibt immer geordnet, sodass eine schnelle Suche nach exakten Übereinstimmungen (Gleichheitsoperatoren) und Bereichen (z. B. Größer-als-, Kleiner-als- und ZWISCHEN-Operatoren) möglich ist. Solche Indizes sind für die meisten Speicher-Engines wie InnoDB und MyISAM verfügbar. Da ein B-Baum-Knoten viele untergeordnete Knoten haben kann, unterscheidet sich ein B-Baum von einem Binärbaum, bei dem jeder Knoten höchstens zwei untergeordnete Knoten haben kann. Mit dem Begriff „B-Baum“ ist eine allgemeine Klasse von Indexdesigns gemeint. Die von der MySQL-Speicher-Engine verwendete B-Baum-Struktur kann aufgrund der im klassischen B-Baum-Design nicht vorhandenen Komplexität als eine Variante betrachtet werden. Hash-IndexEin Indextyp, der für Abfragen entwickelt wurde, die den Gleichheitsoperator anstelle des Bereichsoperators verwenden. Es kann für MEMORY-Tabellen verwendet werden. Obwohl Hash-Indizes aus historischen Gründen der Standardindex für MEMORY-Tabellen sind, unterstützt die Speicher-Engine auch B-Tree-Indizes, die im Allgemeinen für allgemeine Abfragen die bessere Wahl sind. 6. Datengröße optimierenEntwerfen Sie Tabellen so, dass sie möglichst wenig Speicherplatz auf der Festplatte beanspruchen. Dies kann eine enorme Verbesserung darstellen, da die auf die Festplatte geschriebene und von der Festplatte gelesene Datenmenge reduziert wird. Kleinere Tabellen benötigen im Allgemeinen weniger Hauptspeicher für die Verarbeitung ihrer Inhalte während der Abfrageausführung. Jede Reduzierung des Speicherplatzes für die Tabellendaten führt zu kleineren Indizes, die schneller verarbeitet werden können. MySQL unterstützt viele verschiedene Speicher-Engines (Tabellentypen) und Zeilenformate. Sie können für jede Tabelle entscheiden, welche Speicher- und Indizierungsmethode verwendet werden soll. Die Wahl des geeigneten Tabellenformats für Ihre Anwendung kann die Leistung erheblich verbessern. Tabellenspalten
ZeilenformatUm den Speicherplatz weiter zu reduzieren, indem Sie Tabellendaten in komprimierter Form speichern, geben Sie beim Erstellen einer InnoDB-Tabelle ROW_FORMAT=COMPRESSED an. Indizes
Verknüpfungen Deklarieren Sie Spalten mit identischen Informationen in verschiedenen Tabellen mit demselben Datentyp, um Verknüpfungen basierend auf entsprechenden Spalten zu beschleunigen. NormalisierungVersuchen Sie grundsätzlich, alle Daten nicht redundant zu halten (in der Datenbanktheorie als dritte Normalform bezeichnet). Weisen Sie ihnen eindeutige IDs anstelle eines langen, sich wiederholenden Werts zu, wiederholen Sie diese IDs in so vielen kleineren Tabellen wie nötig und verknüpfen Sie die Tabellen in Abfragen, indem Sie in der Join-Klausel auf die IDs verweisen. 7. Datentypen optimierenNumerische TypenZur eindeutigen Identifizierung von Zeilen empfiehlt sich die Verwendung numerischer Werte anstelle von Zeichenfolgen, da große Zahlen weniger Speicherplatz beanspruchen als die entsprechenden Zeichenfolgen, ihre Übertragung und ihr Vergleich also schneller erfolgt und weniger Speicher beansprucht. Zeichen- und Zeichenfolgetypen
andere
Oben finden Sie Einzelheiten zur Optimierung von MySQL-Indizes. Weitere Informationen zur Optimierung von MySQL-Indizes finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM! Das könnte Sie auch interessieren:
|
<<: Tutorial zu XHTML-Webseiten
Standardmäßig läuft Docker über einen nicht verne...
F: Ich weiß nicht, was der Unterschied zwischen XM...
In diesem Artikelbeispiel wird der spezifische Ja...
Heute ist ein weiterer sehr praktischer Fall. All...
1. Hintergrund Wir führen von Zeit zu Zeit intern...
Der offizielle Quellcode von monaco-editor-vue la...
In diesem Artikel finden Sie den spezifischen Cod...
Inhaltsverzeichnis 1. Gojs-Implementierung 1. Zei...
Remotebereitstellung der MySQL-Datenbank unter Li...
Keil Da auf dem Computer eine relativ alte MySQL-...
Einführung in Vue und Vue-Router <script src=&...
Ich habe gerade angefangen, React für Projekte zu...
filter werden im Allgemeinen verwendet, um bestim...
Oft möchten wir in Linux eine Datei finden, wisse...
Vorwort Dieser Artikel stellt hauptsächlich die r...