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
Inhaltsverzeichnis 1. Digitaler Betrieb (1) Gener...
Methode 1: Verwenden Sie das Zielereignisattribut...
1. Einige Tipps zu mit class in react deklarierte...
Bei vielen Benutzern ist dieser Fehler beim Start...
Das Flexbox-Layoutmodul soll eine effizientere Mö...
Servermanager-Startfehler bei Verbindung zur Date...
<br />Durch die Frame-Struktur ist die gleic...
Inhaltsverzeichnis Design Komponentenkommunikatio...
Mögliche Lösungen 1. Math.random generiert Zufall...
Installieren Sie Oracle_11g mit Docker 1. Ziehen ...
Beispielverwendung Code kopieren Der Code lautet w...
Der Schlüssel zum Erreichen der Zuordnung des Rahm...
<br />Vorheriger Artikel: Sieben Prinzipien ...
Inhaltsverzeichnis 1. Verwenden Sie die Komponent...
1. Alibaba Cloud wählt den geeigneten Cloud-Serve...