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

Unterschied und Implementierung von JavaScript Anti-Shake und Throttling

Inhaltsverzeichnis 1. Anti-Shake 2. Drosselung 3....

So paginieren Sie schnell MySQL-Datenmengen im zweistelligen Millionenbereich

Vorwort Um bei der Backend-Entwicklung zu verhind...

So installieren Sie die Linux-Onlinesoftware gcc online

Befehle zur Linux-Onlineinstallation: yum install...

Was sind die Unterschiede zwischen xHTML- und HTML-Tags?

Alle Tags müssen klein geschrieben sein In XHTML m...

Implementierung von 2D- und 3D-Transformationen in CSS3

CSS3 implementiert 2D-Ebenentransformation und vi...

Drei Implementierungsmethoden für die MySQL-Kopiertabelle und die Grant-Analyse

So kopieren Sie schnell eine Tabelle Erstellen Si...

Der Unterschied zwischen Name und Wert im Eingabe-Tag

Typ ist das Steuerelement, das für die Eingabe und...

Eine kurze Diskussion über die Platzierung von Skripten in HTML

Früher dachte ich, dass Skripte überall in HTML p...

Diagramm des Tomcat CentOS-Installationsprozesses

Tomcat CentOS-Installation Dieses Installationstu...

Detaillierte Codebeispiele zu sieben Methoden zur vertikalen Zentrierung mit CSS

Wenn wir ein Layout bearbeiten, verwenden wir nor...

border-radius ist eine Methode zum Hinzufügen abgerundeter Ränder zu Elementen

border-radius:10px; /* Alle Ecken sind mit einem ...

Informationen zur Verwendung der Vue v-on-Direktive

Inhaltsverzeichnis 1. Auf Ereignisse achten 2. Üb...