Heim  >  Artikel  >  Datenbank  >  MySQL-Indizierung und -Optimierung

MySQL-Indizierung und -Optimierung

黄舟
黄舟Original
2017-02-06 10:19:291067Durchsuche

1. Wählen Sie den Datentyp des Index

Die Auswahl des geeigneten Datentyps zum Speichern von Daten hat großen Einfluss auf die Leistung. Im Allgemeinen können einige Richtlinien befolgt werden:

(1) Kleinere Datentypen sind normalerweise besser: Kleinere Datentypen erfordern normalerweise weniger Speicherplatz auf Festplatte, Speicher und CPU-Cache. Die Verarbeitung ist schneller.
(2) Einfache Datentypen sind besser: Ganzzahlige Daten haben weniger Verarbeitungsaufwand als Zeichen, da der Vergleich von Zeichenfolgen komplexer ist. In MySQL sollten Sie zum Speichern der Zeit die integrierten Datums- und Uhrzeitdatentypen anstelle von Zeichenfolgen verwenden und zum Speichern von IP-Adressen ganzzahlige Datentypen verwenden.
(3) Versuchen Sie NULL zu vermeiden: Die Spalte sollte als NOT NULL angegeben werden, es sei denn, Sie möchten NULL speichern. In MySQL ist es schwierig, Abfragen für Spalten mit Nullwerten zu optimieren, da sie Indizes, Indexstatistiken und Vergleichsvorgänge erschweren. Sie sollten Nullwerte durch 0, einen Sonderwert oder eine leere Zeichenfolge ersetzen.

1.1. Wählen Sie eine Kennung
Die Auswahl einer geeigneten Kennung ist sehr wichtig. Bei der Auswahl sollten Sie nicht nur den Speichertyp berücksichtigen, sondern auch, wie MySQL Operationen und Vergleiche durchführt. Sobald ein Datentyp ausgewählt ist, sollte sichergestellt werden, dass alle zugehörigen Tabellen denselben Datentyp verwenden.
(1) Integer-Typ: Normalerweise die beste Wahl als Bezeichner, da er schneller verarbeitet werden kann und auf AUTO_INCREMENT gesetzt werden kann.

(2) String: Vermeiden Sie die Verwendung von Strings als Bezeichner, da diese mehr Platz beanspruchen und langsamer verarbeitet werden. Außerdem sind Zeichenfolgen im Allgemeinen zufällig, sodass ihre Position im Index ebenfalls zufällig ist, was zu Seitenaufteilungen, wahlfreiem Zugriff auf die Festplatte und Aufteilungen von Clustered-Indizes (für Speicher-Engines, die Clustered-Indizes verwenden) führen kann.

2. Einführung in Indizes
Für jedes DBMS sind Indizes der wichtigste Faktor für die Optimierung. Bei einer kleinen Datenmenge sind die Auswirkungen, wenn kein geeigneter Index vorhanden ist, nicht groß, aber mit zunehmender Datenmenge nimmt die Leistung stark ab.
Wenn mehrere Spalten indiziert werden (kombinierter Index), ist die Reihenfolge der Spalten sehr wichtig. MySQL kann nur eine effektive Suche für das ganz linke Präfix des Index durchführen. Beispiel:
Angenommen, es gibt einen kombinierten Index it1c1c2(c1,c2), und die Abfrageanweisung select * from t1, wobei c1=1 und c2=2 diesen Index verwenden kann. Die Abfrageanweisung „select * from t1 where c1=1“ kann diesen Index ebenfalls verwenden. Allerdings kann die Abfrageanweisung „select * from t1“ diesen Index nicht verwenden, da es keine führende Spalte des kombinierten Indexes gibt. Das heißt, wenn Sie Spalte c2 für die Suche verwenden möchten, muss c1 einem bestimmten Wert entsprechen.

2.1. Indextyp
Der Index wird in der Speicher-Engine implementiert, nicht in der Serverschicht. Daher sind die Indizes der einzelnen Speicher-Engines nicht unbedingt genau gleich und nicht alle Speicher-Engines unterstützen alle Indextypen.
2.1.1, B-Tree-Index
Angenommen, es gibt die folgende Tabelle:

CREATE TABLE People (
     last_name varchar(50)    not null,
     first_name varchar(50)    not   null,
     dob        date           not null,
     gender     enum('m', 'f') not   null,
     key(last_name, first_name, dob)
);

Ihr Index enthält die Spalten „last_name“, „first_name“ und „dob“ jeder Zeile in der Tabelle. Seine Struktur ist ungefähr wie folgt:

MySQL-Indizierung und -Optimierung

Die im Index gespeicherten Werte sind in der Reihenfolge in der Indexspalte angeordnet. Sie können den B-Tree-Index verwenden, um alle Schlüsselwörter, Schlüsselwortbereiche und Schlüsselwortpräfixe abzufragen. Wenn Sie den Index verwenden möchten, müssen Sie natürlich sicherstellen, dass Sie nach dem Präfix ganz links im Index suchen.
(1) Übereinstimmung mit dem vollständigen Wert: Geben Sie bestimmte Werte für alle Spalten im Index an. Der Index im Bild oben kann Ihnen beispielsweise dabei helfen, Cuba Allen zu finden, der am 01.01.1960 geboren wurde.
(2) Passen Sie ein Präfix ganz links an: Sie können den Index verwenden, um die Person zu finden, deren Nachname Allen ist, indem Sie nur die erste Spalte im Index verwenden.
(3) Passen Sie ein Spaltenpräfix an: Sie können den Index beispielsweise verwenden, um Personen zu finden, deren Nachname mit J beginnt. Dabei wird nur die erste Spalte im Index verwendet.
(4) Übereinstimmung mit einem Wertebereich: Sie können den Index verwenden, um Personen zu finden, deren Nachnamen zwischen Allen und Barrymore liegen, und nur die erste Spalte im Index verwenden.
(5) Übereinstimmung mit einem Teil genau und Übereinstimmung mit einem Bereich in einem anderen Teil (Übereinstimmung mit einem Teil und Übereinstimmung mit einem Bereich in einem anderen Teil): Sie können den Index verwenden, um Personen zu finden, deren Nachname Allen ist und deren Vorname mit beginnt der Buchstabe K.
(6) Nur-Index-Abfragen: Wenn sich alle abgefragten Spalten im Index befinden, muss der Wert des Tupels nicht gelesen werden.
Da die Knoten im B-Baum sequentiell gespeichert werden, können Sie den Index zum Suchen (bestimmte Werte finden) verwenden oder NACH den Abfrageergebnissen sortieren. Natürlich gibt es einige Einschränkungen bei der Verwendung von B-Tree-Indizes:
(1) Die Abfrage muss in der Spalte ganz links im Index beginnen. Dieser Punkt wurde schon oft erwähnt. Sie können beispielsweise keinen Index verwenden, um Personen zu finden, die an einem bestimmten Tag geboren sind.
(2) Eine Indexspalte kann nicht übersprungen werden. Beispielsweise können Sie einen Index nicht verwenden, um eine Person zu finden, deren Nachname Smith war und die an einem bestimmten Tag geboren wurde.
(3) Die Speicher-Engine kann die Spalten rechts von der Bereichsbedingung im Index nicht verwenden. Wenn Ihre Abfrageanweisung beispielsweise WHERE last_name="Smith" AND first_name LIKE 'J%' AND dob='1976-12-23' lautet, verwendet die Abfrage nur die ersten beiden Spalten im Index, da es sich bei LIKE um eine Bereichsabfrage handelt .

Das Obige ist der Inhalt der MySQL-Indizierung und -Optimierung. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn