Warum wird deine Like-Aussage nicht indexiert?

Warum wird deine Like-Aussage nicht indexiert?

Vorwort

Dieser Artikel zielt darauf ab, die langweiligsten Grundkenntnisse in der beliebtesten Sprache zu erklären

Dieses Thema ist ziemlich interessant. Gestern Mittag, nach dem Mittagessen, fragte ein Kollege plötzlich: „Gibt es einen Index für „Gefällt mir“?“ Ich sagte nein, und ein anderer Kollege erwiderte, dass ja, und einige Kollegen sagten, es hänge von der Situation ab. Ich war etwas verwirrt und wusste nicht, welche Aussage richtig war, also beschloss ich, eine halbe Stunde damit zu verbringen, dieses Problem zu untersuchen und zu überprüfen, und bekam schließlich die Antwort.

Wie kann ich das überprüfen?

Es gibt ein Gerücht, dass es ein magisches Tool zur Leistungsoptimierung von MySQL namens „Explain“ gibt, das Select-Anweisungen analysieren und ausführliche Informationen zum Select-Ausführungsprozess ausgeben kann, sodass Entwickler aus diesen Informationen Optimierungsideen gewinnen können.

Lassen Sie uns über den von MySQL bereitgestellten EXPLAIN-Befehl sprechen:

Syntax: Erläuterung des SQL-Statement-Beispiels:

1erklären Sie „select * from user where id=1“

Nach der Ausführung enthält die Ausgabe die folgenden Felder:

Ausweis
Wählen Sie Typ
Tisch
Partitionen
Typ
mögliche Schlüssel
Schlüssel
Schlüssellänge
Referenz
Reihen
Extra

Um zu wissen, wie Sie die Benennung erläutern, müssen Sie diese Felder verstehen.

1. Ich würde

Die Kennung der SELECT-Abfrage. Jeder SELECT-Anweisung wird automatisch eine eindeutige Kennung zugewiesen.

2. Typ auswählen

Der Typ jeder Select-Abfrageanweisung, der spezifische Typ und die entsprechende Funktion sind wie folgt:

Typname erklären
EINFACH Einfaches SELECT, kein UNION oder Unterabfrage usw.
PRIMÄR Wenn die Abfrage komplexe Unterteile enthält, wird die äußerste Auswahl als PRIMARY markiert.
UNION Die zweite oder nachfolgende SELECT-Anweisung in einer UNION
ABHÄNGIGE GEWERKSCHAFT Die zweite oder nachfolgende SELECT-Anweisung in einer UNION hängen von der äußeren Abfrage ab.
UNION-ERGEBNIS Das Ergebnis von UNION
UNTERABFRAGE Das erste SELECT in der Unterabfrage
ABHÄNGIGE UNTERABFRAGE Das erste SELECT in einer Unterabfrage hängt von der äußeren Abfrage ab.
ABGELEITET Unterabfragen in den SELECT- und FROM-Klauseln abgeleiteter Tabellen
Nicht zwischenspeicherbare Unterabfrage Das Ergebnis einer Unterabfrage kann nicht zwischengespeichert werden und die erste Zeile des äußeren Joins muss erneut ausgewertet werden

3. Tabelle

Zeigt an, aus welcher Tabelle die Daten in dieser Zeile stammen, manchmal zeigt der Kurzschluss jedoch nicht den tatsächlichen Tabellennamen an.

4. Partitionen

Passende Partitionen (das ist derzeit nicht sehr nützlich)

5. Typ

Zugriffstyp, der angibt, wie MySQL die gewünschte Zeile in der Tabelle findet. Die entsprechenden Werte und Erklärungen lauten wie folgt:

Typname Ausgezeichnetes Niveau erklären
System 1 Die Tabelle hat nur eine Zeile
Konstante 2 Die Tabelle hat höchstens eine übereinstimmende Zeile, die zu Beginn der Abfrage gelesen wird.
eq_ref 3 Verwenden Sie den Primärschlüssel oder den eindeutigen Schlüssel als Bedingung für den Multi-Table-Join, um nur eine Zeile aus dieser Tabelle zu lesen.
Referenz 4 Der als Abfragebedingung verwendete Index wird aus der Tabelle in jeder Tabelle gelesen, in der die Zeilen gelesen werden, die dem Indexwert entsprechen.
Volltext 5 Volltextindexsuche
ref_or_null 6 Wie ref, jedoch mit Unterstützung für NULL-Wertabfragen
index_merge 7 Zeigt an, dass die Index-Merge-Optimierungsmethode verwendet wird
eindeutige Unterabfrage 8 Wird verwendet, um die Unterabfrage zu ersetzen.
Index-Unterabfrage 9 Die In-Unterabfrage wird durch die In-Unterabfrage ersetzt, gilt jedoch nur für nicht eindeutige Indizes in der Unterabfrage.
Reichweite 10 Rufen Sie nur einen bestimmten Zeilenbereich ab und verwenden Sie einen Index zum Auswählen der Zeilen.
Index 11 Vollständiger Tabellenscan, aber die Tabelle wird in der Reihenfolge des Index gescannt
ALLE 12 Vollständiger Tabellenscan zum Auffinden übereinstimmender Zeilen

Typ ist der Zugriffstyp. Sein Wert stellt den in der aktuellen Abfrage verwendeten Typ dar und ist ein wichtiger Leistungsindikator. Wie aus der Tabelle ersichtlich, wird der Scan-Weg der Tabelle von oben nach unten immer breiter und die Leistung immer schlechter. Daher ist es für eine Abfrage am besten, sie über der Bereichsebene zu halten.

6. mögliche Schlüssel

Geben Sie aktiv an, welchen Index die Abfrage verwenden kann, um Datensätze in der Tabelle zu finden. Das heißt, die Felder in der Abfrage werden mit Indizes aufgelistet, werden aber nicht unbedingt von der Abfrage verwendet.

7. Schlüssel

Zeigt den tatsächlichen Index/Schlüssel an, der in der Abfrage verwendet wird, oder NULL, wenn kein Index vorhanden ist. Wenn Sie die Abfrage jedoch zwingen möchten, den Index in der Spalte „possible_keys“ zu verwenden oder zu ignorieren, können Sie in der Abfrage FORCE INDEX, USE INDEX oder IGNORE INDEX verwenden.

8. Schlüssellänge

Gibt die Anzahl der im Index verwendeten Bytes an.

9. ref

Gibt an, welche Spalten oder Konstanten zum Nachschlagen von Werten in der Indexspalte verwendet werden.

10. Reihen

Zeigt die geschätzte Anzahl der Zeilen an, die zum Finden übereinstimmender Datensätze für die aktuelle Abfrage erforderlich sind.

11. Extra

Zeigt die für die aktuelle Abfrage verwendete Lösung an. Folgende Situationen sind möglich:

Typname erklären
Verwenden von „where“ Spaltendaten werden aus der Tabelle nur unter Verwendung der Informationen im Index zurückgegeben, ohne die Tabelle tatsächlich zu lesen.
Mit temporären Gibt an, dass MySQL eine temporäre Tabelle zum Speichern des Ergebnissatzes verwenden muss, was beim Sortieren und Gruppieren von Abfragen üblich ist.
Verwenden von Filesort Sortiervorgänge in MySQL, die nicht mithilfe von Indizes durchgeführt werden können, werden als „Dateisortierungen“ bezeichnet.
Verwenden des Join-Puffers Dieser Wert betont, dass beim Abrufen der Join-Bedingung kein Index verwendet wird und ein Join-Puffer zum Speichern von Zwischenergebnissen erforderlich ist. Wenn dieser Wert angezeigt wird, sollten Sie sich darüber im Klaren sein, dass Sie je nach den spezifischen Umständen der Abfrage möglicherweise einen Index hinzufügen müssen, um die Leistung zu verbessern.
Unmöglich, wo Dieser Wert betont, dass die Where-Klausel keine qualifizierenden Zeilen zur Folge hat.
Tabellen auswählen, die optimiert wurden Dieser Wert bedeutet, dass der Optimierer nur eine Zeile aus dem Ergebnis der Aggregatfunktion zurückgeben kann, indem nur der Index verwendet wird.

Nachdem wir nun die Syntax erklärt haben, führen wir einige tatsächliche Operationen durch. Erstellen Sie zunächst eine Tabelle:

-- Tabelle erstellen CREATE TABLE-Test (
id INT(11) NOT NULL AUTO_INCREMENT,
uname VARCHAR(255),
PRIMÄRSCHLÜSSEL(id) 
);

Fügen Sie dann dem uname-Feld einen Index hinzu:

-- Index hinzufügen ALTER TABLE-Test ADD INDEX uname_index (uname);

Überprüfen Sie, ob der Index erfolgreich hinzugefügt wurde:

-- Prüfen, ob ein Index vorhanden ist. SHOW INDEX FROM-Test;

Die Ausgabe ist:

Es ist ersichtlich, dass der Index erfolgreich erstellt wurde. Fügen Sie als Nächstes einige Daten hinzu:

- Fügen Sie einige Daten hinzu INSERT INTO test VALUES(1,'jay');
INSERT INTO Testwerte (2, 'ja');
INSERT INTO Testwerte (3, 'bril');
INSERT INTO Testwerte (4, 'aybar');

Alles ist bereit. Lassen Sie uns den Befehl „explain“ verwenden, um zu untersuchen, ob einige „like“-Anweisungen Indizes haben. Es gibt vier Fälle von „like“, nämlich no%, %%, left%, right% und

1. Wie Feldname

ERKLÄREN SIE, SELECT * FROM test WHERE uname LIKE 'j';

Die Ausgabe ist:

Es ist ersichtlich, dass der Wert des Typs „Bereich“ und der Wert des Schlüssels „uname_index“ ist, was bedeutet, dass in diesem Fall der Index verwendet wird.

2. wie %Feldname%

ERKLÄREN SIE, SELECT * FROM test WHERE uname LIKE '%j%';

Die Ausgabe ist:

Es ist ersichtlich, dass der Wert des Typs ALL ist, was einen vollständigen Tabellenscan bedeutet, und der Wert des Schlüssels NULL ist, was bedeutet, dass kein Index verwendet wird.

3. wie % Feldname

ERKLÄREN SIE, SELECT * FROM test WHERE uname LIKE '%j';

Die Ausgabe ist:

Es ist ersichtlich, dass der Wert des Typs ALL ist, der Wert des Schlüssels NULL ist und der Index ebenfalls nicht verwendet wird.

4. Wie Feldname%

ERKLÄREN SIE, SELECT * FROM Test WHERE uname LIKE 'j%';

Die Ausgabe ist:

Es ist ersichtlich, dass der Wert des Typs „Bereich“ und der Wert des Schlüssels „uname_index“ ist, was bedeutet, dass in diesem Fall der Index verwendet wird.

Zusammenfassen

Aus dem obigen Experiment können wir die Regel zusammenfassen, ob „like“ den Index verwendet: Damit die „like“-Anweisung den Index wirksam macht, darf „like“ nicht mit „%“ beginnen, d. h. Anweisungen wie „(like %Feldname%)“ und „(like %Feldname)“ machen den Index ungültig, während Anweisungen wie „(like Feldname)“ und „(like Feldname%)“ den Index normal verwenden können.

andere

Um das Problem des Index-Like zu überprüfen, haben wir MySQLs magische Erklärung untersucht. Allerdings kann die Erklärung nicht nur die Indexnutzung überprüfen, sondern bietet auch viele andere Hilfen zur Leistungsoptimierung. Was die spezifische Nutzung betrifft, ist sie eigentlich dieselbe wie oben erwähnt. Listen Sie die Erklärungsergebnisse auf und folgen Sie dann den Hinweisen, um die zugehörigen Felder zu überprüfen und den entsprechenden Inhalt zu erhalten.

Nun, das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Lernwert für Ihr Studium oder Ihre Arbeit hat. Wenn Sie Fragen haben, können Sie eine Nachricht hinterlassen. Vielen Dank für Ihre Unterstützung von 123WORDPRESS.COM.

Das könnte Sie auch interessieren:
  • Detaillierte Erläuterung der Verwendung des umgekehrten Index zur Optimierung der Like-Anweisung

<<:  Detaillierte Erklärung der Standort- und Umschreibenutzung in nginx

>>:  Detaillierte Erklärung der Front-End-Sicherheit: JavaScript-Anti-HTTP-Hijacking und XSS

Artikel empfehlen

Ein kurzer Vergleich von Props in React

Inhaltsverzeichnis Props-Vergleich von Klassenkom...

MySQL führt Befehle für externe SQL-Skriptdateien aus

Inhaltsverzeichnis 1. Erstellen Sie eine SQL-Skri...

my.cnf-Parameterkonfiguration zur Optimierung der InnoDB-Engine-Leistung

Ich habe im Internet unzählige my.cnf-Konfigurati...

Grundlegende Ideen und Codes zur Implementierung von Videoplayern in Browsern

Inhaltsverzeichnis Vorwort Zusammenfassung der Au...

So verwenden Sie Übersetzung und Übergang in CSS3

Ich habe immer das Gefühl, dass Übersetzen und Üb...

Quellcode der HTML-Einstellungen für die Benutzerregistrierungsseite

Gestalten Sie die oben gezeigte Webseite: <!DOC...

Detaillierte Erläuterung der Nginx-Anti-Hotlink- und Anti-Crawler-Konfiguration

Erstellen Sie eine neue Konfigurationsdatei (gehe...

Erläuterung der MySQL-Leistungsprüfung durch den Befehl „show processlist“

Der Befehl „show processlist“ ist sehr nützlich. ...

Grafisches Tutorial zur Installation von JDK1.8 unter CentOS7.4

Schritte zur Linux-Installation von JDK1.8 1. Übe...

Implementierungsprozessdatensatz für benutzerdefinierte Vue-Tabellenspalten

Inhaltsverzeichnis Vorwort Rendern setTable-Kompo...