HintergrundVor kurzem wurde aufgrund der Verwendung von „or“ und „ !=“ eine langsame SQL-Anweisung erstellt, die einen Indexfehler verursachte. Ich habe also die zehn häufigsten Ursachen für Indexfehler zusammengefasst. Ich hoffe, dass sie Ihnen weiterhelfen. Kommen Sie. 1. Die Abfragebedingung enthält "oder", was dazu führen kann, dass der Index fehlschlägtErstellen Sie eine neue Benutzertabelle mit einem gemeinsamen Index „userId“ und folgender Struktur: CREATE TABLE `Benutzer` ( `id` int(11) NICHT NULL AUTO_INCREMENT, `userId` int(11) NICHT NULL, `Alter` int(11) NICHT NULL, `name` varchar(255) NICHT NULL, Primärschlüssel (`id`), SCHLÜSSEL `idx_userId` (`userId`) )ENGINE=InnoDB STANDARD-CHARSET=utf8; Bei der Ausführung einer SQL-Abfrage wird der Index durchsucht, wie in der folgenden Abbildung dargestellt: Das Hinzufügen der Bedingung „oder“ + „Alter“ ohne Index führt dazu, dass der Index nicht verwendet wird, wie in der Abbildung gezeigt: Analyse & Fazit:
Hinweis: Wenn die Spalten in der Bedingung „oder“ indexiert sind, kann die Indexierung fehlschlagen. Sie können es selbst versuchen. 2. Wenn der Feldtyp eine Zeichenfolge ist, müssen Sie ihn bei der Verwendung von where unbedingt in Anführungszeichen einschließen, da sonst der Index ungültig istNehmen wir an, dass die Demotabelle wie folgt aufgebaut ist: CREATE TABLE `Benutzer` ( `id` int(11) NICHT NULL AUTO_INCREMENT, `userId` varchar(32) NICHT NULL, `name` varchar(255) NICHT NULL, Primärschlüssel (`id`), SCHLÜSSEL `idx_userId` (`userId`) MIT BTREE ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; userId ist ein Zeichenfolgentyp, der ein gemeinsamer Index des B+-Baums ist. Wenn in der Abfragebedingung eine Nummer übergeben wird, wird sie nicht durch den Index geleitet, wie in der Abbildung dargestellt: Wenn Sie der Zahl '' hinzufügen, also eine Zeichenfolge übergeben, erfolgt die Sortierung natürlich nach Index, wie unten gezeigt: Analyse und Fazit: Warum durchläuft die erste Anweisung den Index nicht ohne einfache Anführungszeichen? Dies liegt daran, dass ohne einfache Anführungszeichen der Vergleich zwischen Zeichenfolgen und Zahlen erfolgt und deren Typen nicht übereinstimmen. MySQL führt eine implizite Typkonvertierung durch und wandelt sie vor dem Vergleich in Gleitkommazahlen um. 3. Ähnliche Platzhalter können zur Ungültigkeit des Index führen.Es ist nicht so, dass der Index ungültig wird, wenn das Like-Platzhalterzeichen verwendet wird, sondern dass die Like-Abfrage mit % beginnt, was dazu führt, dass der Index ungültig wird. Tabellenstruktur: CREATE TABLE `Benutzer` ( `id` int(11) NICHT NULL AUTO_INCREMENT, `userId` varchar(32) NICHT NULL, `name` varchar(255) NICHT NULL, Primärschlüssel (`id`), SCHLÜSSEL `idx_userId` (`userId`) MIT BTREE ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; Wenn die Abfrage mit „%“ beginnt, ist der Index ungültig, wie in der Abbildung gezeigt: Setzen Sie am Ende „%“ und stellen Sie fest, dass der Index weiterhin normal funktioniert, und zwar wie folgt: Fügen Sie % wieder hinzu und ändern Sie es so, dass nur die indexierten Felder ( die den Index abdecken ) durchsucht werden. Ich habe festgestellt, dass der Index immer noch verwendet wird. Sind Sie überrascht? abschließend: Wenn die Like-Abfrage mit % beginnt, wird der Index ungültig. Zur Optimierung gibt es zwei Möglichkeiten:
Hinweis: Ein Index, der alle Daten enthält, die die Abfrageanforderungen erfüllen, wird als überdeckender Index bezeichnet. 4. Kombinierter Index: Wenn die Bedingungsspalte während der Abfrage nicht die erste Spalte im kombinierten Index ist, ist der Index ungültig. Tabellenstruktur: (Es gibt einen gemeinsamen Index CREATE TABLE `Benutzer` ( `id` int(11) NICHT NULL AUTO_INCREMENT, `userId` int(11) NICHT NULL, `Alter` int(11) DEFAULT NULL, `name` varchar(255) NICHT NULL, Primärschlüssel (`id`), SCHLÜSSEL `idx_userid_age` (`userId`,`age`) MIT BTREE ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; Wenn in einem gemeinsamen Index die Abfragebedingung das Prinzip der ganz links stehenden Übereinstimmung erfüllt, ist der Index normal wirksam. Bitte sehen Sie sich die Demo an: Wenn die Bedingungsspalte nicht die erste Spalte im gemeinsamen Index ist, wird der Index wie folgt ungültig: Analyse und Fazit:
5. Die Verwendung der integrierten Funktionen von MySQL auf der Indexspalte führt dazu, dass der Index ungültig wird.Tabellenstruktur: CREATE TABLE `Benutzer` ( `id` int(11) NICHT NULL AUTO_INCREMENT, `userId` varchar(32) NICHT NULL, `loginTime` datetime NICHT NULL, Primärschlüssel (`id`), SCHLÜSSEL `idx_userId` (`userId`) MIT BTREE, SCHLÜSSEL `idx_login_time` (`loginTime`) MIT BTREE ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; Obwohl loginTime indiziert ist, ist der Index direkt GG, da die integrierte Funktion Date_ADD () von MySQL verwendet wird, wie in der Abbildung gezeigt: 6. Wenn Operationen an Indexspalten ausgeführt werden (wie +, -, *, /), wird der Index ungültig.Tabellenstruktur: CREATE TABLE `Benutzer` ( `id` int(11) NICHT NULL AUTO_INCREMENT, `userId` varchar(32) NICHT NULL, `Alter` int(11) DEFAULT NULL, Primärschlüssel (`id`), SCHLÜSSEL `idx_age` (`Alter`) MIT BTREE ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; Obwohl das Alter indexiert ist, geht der Index verloren, da er berechnet wird. . . Wie in der Abbildung gezeigt: 7. Wenn (!= oder < >, nicht in) im Indexfeld verwendet wird, kann der Index ungültig werden.Tabellenstruktur: CREATE TABLE `Benutzer` ( `id` int(11) NICHT NULL AUTO_INCREMENT, `userId` int(11) NICHT NULL, `Alter` int(11) DEFAULT NULL, `name` varchar(255) NICHT NULL, Primärschlüssel (`id`), SCHLÜSSEL `idx_age` (`Alter`) MIT BTREE ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; Obwohl das Alter indiziert ist, wird es verwendet! = oder < >, nicht drin, der Index ist Dummy. wie folgt: 8. Die Verwendung von „is null“ und „is not null“ im Indexfeld kann dazu führen, dass der Index fehlschlägt.Tabellenstruktur: CREATE TABLE `Benutzer` ( `id` int(11) NICHT NULL AUTO_INCREMENT, `Karte` varchar(255) DEFAULT NULL, `name` varchar(255) DEFAULT NULL, Primärschlüssel (`id`), SCHLÜSSEL `idx_name` (`name`) USING BTREE, SCHLÜSSEL `idx_card` (`card`) MIT BTREE ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; Wenn ein einzelnes Namensfeld indiziert ist und die Abfrage nach einem nicht leeren Namen ausgeführt wird, wird der Index wie folgt verwendet: Wenn ein einzelnes Kartenfeld indiziert ist und die Abfrage für einen nicht leeren Namen ausgeführt wird, wird der Index wie folgt verwendet: Wenn es jedoch mit „oder“ verbunden wird, wird der Index wie folgt ungültig: 9. Die Kodierungsformate der mit der Left Join-Abfrage oder der Right Join-Abfrage verknüpften Felder sind unterschiedlich, was zu einem Indexierungsfehler führen kann.Erstellen Sie zwei neue Tabellen, eine Benutzertabelle und eine Benutzerjobtabelle. CREATE TABLE `Benutzer` ( `id` int(11) NICHT NULL AUTO_INCREMENT, `name` varchar(255) ZEICHENSATZ utf8mb4 STANDARD NULL, `Alter` int(11) NICHT NULL, Primärschlüssel (`id`), SCHLÜSSEL `idx_name` (`name`) MIT BTREE ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; Tabelle „user_job“ erstellen ( `id` int(11) NICHT NULL, `userId` int(11) NICHT NULL, `job` varchar(255) DEFAULT NULL, `name` varchar(255) DEFAULT NULL, Primärschlüssel (`id`), SCHLÜSSEL `idx_name` (`name`) MIT BTREE )ENGINE=InnoDB STANDARD-CHARSET=utf8; Das Namensfeld der Benutzertabelle ist in utf8mb4 codiert, während das Namensfeld der User_Job-Tabelle in utf8 codiert ist. Führen Sie die Left-Outer-Join-Abfrage aus. Die Tabelle „user_job“ durchläuft dennoch wie folgt den vollständigen Tabellenscan: Wenn Sie sie so ändern, dass sie die gleiche Kodierung wie das Namensfeld haben, wird der Index weiterhin verwendet. 10. MySQL geht davon aus, dass ein vollständiger Tabellenscan schneller ist als ein Index und verwendet daher den Index nicht.
Aus Effizienz- und Kostengründen schätzt MySQL, was schneller ist: ein vollständiger Tabellenscan oder die Verwendung eines Indexes. Dies hängt mit seinem Optimierer zusammen. Werfen wir einen Blick auf sein logisches Architekturdiagramm (Bildquelle: online) ZusammenfassenWir haben die zehn häufigsten Ursachen für Indexfehler zusammengefasst. Lassen Sie uns die langsame SQL-Anweisung analysieren, die wir erstellt haben. Die simulierte Tabellenstruktur und das verursachende SQL sind wie folgt: Tabelle „Benutzersitzung“ erstellen ( `user_id` varchar(32) ZEICHENSATZ utf8mb4 NICHT NULL, `device_id` varchar(64) NICHT NULL, `status` varchar(2) NICHT NULL, `create_time` datetime NICHT NULL, `update_time` datetime STANDARD NULL BEIM UPDATE CURRENT_TIMESTAMP, PRIMÄRSCHLÜSSEL (`user_id`,`device_id`) MIT BTREE )ENGINE=InnoDB STANDARD-CHARSET=utf8; erklären Benutzersitzung aktualisieren, Status festlegen = 1 wobei (`user_id` = '1' und `device_id` != '2') oder (`user_id` != '1' und `device_id`='2') analysieren:
Lösung: Also, wie lässt sich das Problem lösen? Wir entfernen Abschließend werden die zehn häufigsten Ursachen für Indexfehler zusammengefasst. Ich hoffe, dass jeder diese zehn Ursachen bei seiner Arbeit und seinem Studium berücksichtigen kann, die Dies ist das Ende dieses Artikels über die zehn häufigsten Probleme bei MySQL-Indexfehlern. Weitere Informationen zu den zehn häufigsten Problemen bei MySQL-Indexfehlern finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den verwandten Artikeln weiter unten. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen! Das könnte Sie auch interessieren:
|
<<: Verwenden Sie jQuery, um das Problem mit ungültigen Seitenankerpunkten unter Iframe zu beheben
>>: Beispielcode zum Erzielen eines kleinen Dreiecksrahmeneffekts mit reinem CSS3+DIV
1.html <div Klasse="loginbody"> &...
Inhaltsverzeichnis 1. Vorverarbeitung 2. Zusammen...
Inhaltsverzeichnis 1. Was ist eine Veranstaltung?...
Routenplanung vue-router4 behält den Großteil der...
Lese- und Schreibvorgänge bei Angular Cookies, de...
1. Suchen Sie zunächst die Datendatei auf dem Mig...
Hintergrund: Manchmal müssen wir JSON-Daten direk...
In der vorherigen Entwicklung haben wir die Stand...
ausstellen Design Passwortstärke-Analyse Das Pass...
In diesem Artikelbeispiel wird der spezifische Co...
Code kopieren Der Code lautet wie folgt: <!DOC...
Inhaltsverzeichnis Komplexe Abfrage und schrittwe...
Für viele inländische Werbetreibende ist die Erste...
Auslassungspunkte werden angezeigt, wenn mehrzeil...
Code kopieren Der Code lautet wie folgt: <!DOC...