ProblemübersichtHeute hat der DBA bei der Arbeit plötzlich einen SQL-Teil gefunden, der darauf hinwies, dass das SQL eine implizite Konvertierung aufwies und den Index nicht verwendete. Nach der Überprüfung stellten wir fest, dass es sich um ein Feld vom Typ varchar handelte. Wir verwendeten Bedingungen, um einen numerischen Wert zu übergeben. Aus Bedenken hinsichtlich einer Verletzung der Vertraulichkeitsvereinbarung werde ich das Bild hier nicht veröffentlichen. Lassen Sie mich eine ähnliche Situation reproduzieren, damit sie jeder sehen kann. Reproduktion des ProblemsZuerst erstellen wir eine Benutzertabelle test_user, in der USER_ID auf den Typ varchar gesetzt und der Wirkung halber ein eindeutiger Index hinzugefügt wird. CREATE TABLE test_user ( ID int(11) NICHT NULL AUTO_INCREMENT, USER_ID varchar(11) DEFAULT NULL COMMENT 'Benutzerkonto', USER_NAME varchar(255) DEFAULT NULL COMMENT 'Benutzername', AGE int(5) DEFAULT NULL COMMENT 'Alter', COMMENT varchar(255) DEFAULT NULL COMMENT 'Einführung', PRIMÄRSCHLÜSSEL (ID) EINZIGARTIGER SCHLÜSSEL UNIQUE_USER_ID (USER_ID) MIT BTREE )ENGINE=InnoDB STANDARD-CHARSET=utf8; Die Tabellendaten sind wie folgt (die Daten verwenden immer noch dieselben Daten wie im letzten MySQL-Artikel. MySQL verwendet UNION, um zwei Abfragen zu verbinden, und das Sortieren schlägt fehl. Beachten Sie jedoch, dass die Tabellenstruktur anders ist.)
Als nächstes führen wir das folgende SQL aus EXPLAIN SELECT * FROM Testbenutzer WHERE USER_ID = 111; Die gegebenen Erklärungen lauten wie folgt:
Wir setzen die Bedingung in Anführungszeichen und erläutern sie wie folgt: EXPLAIN SELECT * FROM Testbenutzer WHERE USER_ID = '111'; Zu diesem Zeitpunkt haben wir festgestellt, dass das Feld vom Typ varchar den Index verwendet, wenn es als Zeichenfolge abgefragt wird, den Index jedoch nicht verwendet, wenn es als numerischer Typ abgefragt wird. ProblemerweiterungDie Frage ist also: Wenn das Feld eine Ganzzahl ist und über einen Index verfügt, wird der Index bei einer Abfrage mit einer Zeichenfolge nicht verwendet? Übung macht den Meister, lasst es uns weiter testen. -- Ändern Sie den Typ der USER_ID in eine Ganzzahl, CREATE TABLE test_user ( ID int(11) NICHT NULL AUTO_INCREMENT, USER_ID int(11) DEFAULT NULL COMMENT 'Benutzerkonto', USER_NAME varchar(255) DEFAULT NULL COMMENT 'Benutzername', AGE int(5) DEFAULT NULL COMMENT 'Alter', COMMENT varchar(255) DEFAULT NULL COMMENT 'Einführung', Primärschlüssel (ID), EINZIGARTIGER SCHLÜSSEL UNIQUE_USER_ID (USER_ID) MIT BTREE ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; EXPLAIN SELECT * FROM Testbenutzer WHERE USER_ID = 111; EXPLAIN SELECT * FROM Testbenutzer WHERE USER_ID = '111'; Nach der Ausführung der beiden obigen Anweisungen haben wir festgestellt, dass Felder vom Typ int indiziert werden, unabhängig davon, ob sie als Zeichenfolgen oder numerische Werte abgefragt werden. abschließend
Zusammenfassend denke ich, dass es in Zukunft am besten ist, beim Schreiben von SQL Anführungszeichen hinzuzufügen, um zu vermeiden, dass Zeichenfolgentypen nicht indiziert werden. Die tieferen Prinzipien müssen weiter untersucht werden. Wenn Sie Meinungen dazu haben, diskutieren Sie diese bitte. Dies ist das Ende dieses Artikels über die Ungültigkeitserklärung oder implizite Konvertierung des MySql-Integer-Index und des String-Index. Weitere Informationen zur Ungültigkeitserklärung des MySql-Integer-Index und des String-Index 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:
|
<<: So schreiben Sie HTML-Header in der Webentwicklung für mobile Geräte
>>: Unabhängige Implementierung der Nginx-Containerkonfigurationsdatei
1. Was ist In react Anwendungen werden Ereignisna...
1. ref wird kopiert, die Ansicht wird aktualisier...
Vorwort Bei der Anwendung von Datenbanken haben P...
Der spezifische Code lautet wie folgt: Der HTML-C...
Der Grund ist einfach: In HTML-Dokumenten entsprec...
SELECT * FROM Tabellenname Limit m,n; SELECT * FR...
In diesem Artikel erfahren Sie mehr über einen pr...
Das Projekt interagiert mit dem Server, greift üb...
1. Wenn im Internet Explorer die relative Position...
Dieser Artikel untersucht die ES6-for...of-Schlei...
Es gibt eine solche Anforderung: eine Importschal...
CSS: 1. <link type="text/css" href=&q...
Inhaltsverzeichnis Vorwort Persistenz globaler Pa...
Wenn MySQL Version 5.0 bereits auf dem Computer v...