Hier einige Tipps von Ausbildungsstätten und mein eigenes Resümee: Tabelle „sys_user“ erstellen ( `id` varchar(64) NOT NULL COMMENT 'Primärschlüssel', `name` varchar(64) STANDARD NULL KOMMENTAR 'name', `Alter` int(64) DEFAULT NULL KOMMENTAR 'Alter', `pos` varchar(64) DEFAULT NULL KOMMENTAR 'Position', Primärschlüssel (`id`), SCHLÜSSEL `idx_sys_user_nameAgePos` (`Name`,`Alter`,`Pos`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Benutzertabelle'; Diese Tabelle hat vier Felder: Primärschlüssel, Name, Alter, Position Lassen Sie uns die erste Formel erklären: ALTER TABLE sys_user ADD INDEX idx_sys_user_nameAgePos(Name, Alter, Position); Nachfolgend sehen Sie unsere Suchanweisung: SELECT * FROM sys_user WHERE name = ‚Xiaoming‘ AND age = 22 AND pos = ‚java‘; Ob der Index verwendet wird, können wir erkennen, indem wir vor die Suchanweisung das Schlüsselwort EXLAIN setzen. (1) EXPLAIN SELECT * FROM sys_user WHERE name = 'Xiaoming' AND age = 22 AND pos = 'java'; (2) EXPLAIN SELECT * FROM sys_user WHERE name = 'Xiaoming' AND age = 22; (3) EXPLAIN SELECT * FROM sys_user WHERE name = 'Xiaoming' AND pos = 'java'; Aus den angezeigten Ergebnissen können wir ersehen, dass wir alle drei Felder des ersten zusammengesetzten Index, nur zwei Felder des zweiten zusammengesetzten Index und nur ein Feld des dritten zusammengesetzten Index verwendet haben. Wir verwenden in allen drei Anweisungen Indizes und die erste ist offensichtlich die beste. Mal sehen, was schief geht: (4) EXPLAIN SELECT * FROM sys_user WHERE age = 22; (5) EXPLAIN SELECT * FROM sys_user WHERE pos = 'java'; (6) EXPLAIN SELECT * FROM sys_user WHERE age = 22 AND pos = 'java'; Die oben genannten drei Situationen werden alle zu vollständigen Tabellenscans, da sie das Prinzip des ganz linken Präfixes verletzen. Da die ganz linke Spalte des zusammengesetzten Indexes Name ist, ist der Index ungültig, wenn die Suchbedingung Name nicht vorne steht. Die erste Situation erfüllt die vollständige Werteübereinstimmung, die zweite erfüllt die beiden Felder Name und Alter und die dritte Situation erfüllt nur Name, sodass der Index nur Name verwendet. 3. Führen Sie keine Vorgänge (Berechnungen, Funktionstypkonvertierungen (automatisch oder manuell)) an der Indexspalte durch, da dies den Index ungültig macht und in einen vollständigen Tabellenscan umwandelt. (7) EXPLAIN SELECT * FROM sys_user WHERE LEFT(name,1)='Xiaoming'; Der siebte Fall schlägt fehl, weil die Indexspalte Berechnungen oder Funktionsoperationen ausführt, was zu einem vollständigen Tabellenscan führt. 4. Die Speicher-Engine kann die Spalten auf der rechten Seite der Bereichsbedingung im Index nicht verwenden <br /> Vielleicht verstehen Sie nicht, was der obige Text bedeutet. Führen wir die folgende Abfrageanweisung aus, um ihn zu verstehen. (8) EXPLAIN SELECT * FROM sys_user WHERE name = 'Xiaoming' AND age < 22 AND pos = 'java'; Aus der obigen Abbildung können wir ersehen, dass der Typ zu einer Bereichsebene geworden ist, was bedeutet, dass der Index des POS-Felds nach Alter <22 ungültig ist. 5. Versuchen Sie, abdeckende Indizes zu verwenden (Abfragen, die nur auf den Index zugreifen (Indexspalten und Abfragespalten sind identisch) und reduzieren Sie die Verwendung von select * <br /> Dies ist die wörtliche Bedeutung. Das Abfragen bestimmter Felder ist effizienter als das Abfragen von *. Vergleichen wir es. (9) EXPLAIN SELECT * FROM sys_user WHERE name = 'Xiaoming' AND age = 22 AND pos = 'java'; (10) EXPLAIN SELECT name, age, pos FROM sys_user WHERE name = 'Xiaoming' AND age = 22 AND pos = 'java'; 6. MySQL kann keine Indizes verwenden, wenn ungleiche Werte (!= oder <>) verwendet werden, was zu einem vollständigen Tabellenscan führt (11) EXPLAIN SELECT * FROM sys_user WHERE name != 'Xiaoming' Die Ergebnisse zeigen, dass der Indexfehler einen vollständigen Tabellenscan verursacht hat 7. Ist null, ist nicht null und Indizes können nicht verwendet werden (12) EXPLAIN SELECT * FROM sys_user WHERE name ist nicht null 8. Wenn „like“ mit einem Platzhalter („%abc...“) beginnt, wird der MySQL-Index ungültig und der Vorgang wird zu einem vollständigen Tabellenscan. (Durch das Schreiben von „%“ auf der rechten Seite kann die Ungültigkeit des Index vermieden werden. Wenn das Unternehmen „%abc...%“ wirklich benötigt, können Sie einen überdeckenden Index verwenden, um die Ungültigkeit des Index zu vermeiden.) (13) EXPLAIN SELECT * FROM sys_user WHERE Name wie '%明%' (14) EXPLAIN SELECT * FROM sys_user WHERE Name wie '明%' (15) EXPLAIN SELECT name,age,pos FROM sys_user WHERE name like '%明%' Aus den obigen Ergebnissen geht hervor, dass der erste Index fehlschlägt. Der zweite Index kann Indexfehler vermeiden, indem er einfach das % auf der rechten Seite schreibt. Der dritte Index kann das Problem des Indexfehlers lösen, indem er einen abdeckenden Index verwendet, wenn das Unternehmen wirklich ein SQL wie „%abc...%“ benötigt. 9. Die Indizierung von Zeichenfolgen schlägt fehl, wenn sie nicht in einfache Anführungszeichen eingeschlossen sind (16) EXPLAIN SELECT * FROM sys_user WHERE name=222; Da die Suchzeichenfolge in einfache Anführungszeichen eingeschlossen werden muss, ist die oben verwendete Zahl 222 vom Typ int. Bei der Suche ermittelt MySQL, dass der Name vom Typ varchar ist, und konvertiert 222 zum Abrufen in „222“. Die Indexspalte wird einer Typkonvertierung unterzogen, sodass der Index ungültig wird. 10. Verwenden Sie oder weniger, da es den Index ungültig macht, wenn es zum Verbinden verwendet wird (16) EXPLAIN SELECT * FROM sys_user WHERE name = "Xiaoming" oder age = 22; Dies ist das Ende dieses Artikels über die Situationen, in denen MySQL-Indizes ungültig werden. Weitere Informationen zur Ungültigkeit von MySQL-Indizes finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen! Das könnte Sie auch interessieren:
|
<<: Kann Asynchronität in JavaScript „Await“ speichern?
>>: Lösungen für den Fehler und die Ungültigkeit beim Öffnen von nginx.pid
Die Fallstricke 1. In vielen Tutorials im Interne...
Der Linux-Befehl „seq“ kann blitzschnell Zahlenli...
Aus Kodierungsgründen werden beim Hochladen oder ...
Inhaltsverzeichnis Vorwort Motivation für Fragmen...
Der folgende Beispielcode stellt die Prinzipien d...
Chinesisch-Tutorial https://www.ncnynl.com/catego...
Der spezifische Code lautet wie folgt: <a href...
Bei Ubuntu 20.04 ist die Root-Anmeldung standardm...
1. Zurück-Button Verwenden Sie history.back(), um...
Heute habe ich eine Frage zur Konfiguration einer...
Reine Front-End-Implementierung:切片上傳斷點續傳.斷點續傳muss...
Awk ist eine Anwendung zur Verarbeitung von Textd...
Vor einiger Zeit hat der Blogger das Ubuntu-Syste...
Wenn das Untermenü der Navigationsleiste rekursiv...
Der Dateiname der dynamischen Bibliotheksdatei un...