Eine kurze Diskussion über die Ungültigkeitserklärung oder implizite Konvertierung von MySQL-Integer- und String-Indizes

Eine kurze Diskussion über die Ungültigkeitserklärung oder implizite Konvertierung von MySQL-Integer- und String-Indizes

Problemübersicht

Heute 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 Problems

Zuerst 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.)

AUSWEIS BENUTZER-ID BENUTZERNAME ALTER KOMMENTAR
1 111 Glücklicher Neuling 18 Ich bin heute sehr glücklich
2 222 Trauriger Neuling einundzwanzig Heute ist traurig
3 333 Ernsthafter Neuling 30 Sehr ernst heute
4 444 Glücklicher Neuling 18 Ich bin heute sehr glücklich
5 555 Ernsthafter Neuling einundzwanzig Heute ist es ernst

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:

Ausweis Wählen Sie Typ Tisch Partitionen Typ mögliche Schlüssel Schlüssel Schlüssellänge Referenz Reihen Filtern nach Extra
1 EINFACH Testbenutzer ALLE 5 Verwenden von „where“

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.

Problemerweiterung

Die 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

  1. Wenn das von uns verwendete Feld ein numerischer Typ ist, hat das Hinzufügen oder Nicht-Hinzufügen von Anführungszeichen (einfache und doppelte Anführungszeichen haben in SQL die gleiche Wirkung) keinen Einfluss auf die Verwendung des Index
  2. Wenn unser Feld vom Typ „String“ ist, kann der Index nicht für Abfragen ohne Anführungszeichen verwendet werden. Für Abfragen mit Anführungszeichen kann der Index jedoch normal verwendet werden.

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:
  • Die überraschende implizite Konvertierung von MySQL
  • „Implizite Konvertierung“ von MySQL 5.6 führt zu Indexfehlern und ungenauen Daten
  • Sprechen Sie über implizite Konvertierung in MySQL
  • Beheben von Problemen mit impliziter MySQL-Konvertierung
  • Problem der impliziten Konvertierung der MySQL-Indexungungültigkeit

<<:  So schreiben Sie HTML-Header in der Webentwicklung für mobile Geräte

>>:  Unabhängige Implementierung der Nginx-Containerkonfigurationsdatei

Artikel empfehlen

So kommunizieren Sie mit anderen Benutzern über die Linux-Befehlszeile

Es ist ganz einfach, Nachrichten an andere Benutz...

Probleme bei der Installation von MySQL und mysql.sock unter Linux

Vor kurzem traten bei der Installation von Apache...

Tutorial zur Installation von VMware, Nmap und Burpsuite

Inhaltsverzeichnis VMware BurpSuite 1. Virtuelles...

Tutorial zur Installation von MySQL 5.7.18 auf Mac OS 10.12

Ich habe das ganze Internet durchsucht und bin au...

MySQL-Batch löschen großer Datenmengen

MySQL-Batch löschen großer Datenmengen Angenommen...

JavaScript-Dom-Objektoperationen

Inhaltsverzeichnis 1. Kern 1. Holen Sie sich den ...

Wie kann MySQL das Löschen und Weglaufen von Datenbanken wirksam verhindern?

Inhaltsverzeichnis Einstellungen für den abgesich...

Lösen Sie das Problem der Groß- und Kleinschreibung der Linux+Apache-Server-URL

Ich bin heute auf ein Problem gestoßen. Beim Eing...

Ein kurzes Verständnis der relevanten Sperren in MySQL

Dieser Artikel soll Ihnen vor allem dabei helfen,...

Eine vorläufige Studie zu JSBridge in Javascript

Inhaltsverzeichnis Der Ursprung von JSBridge Das ...

Ausführliches Installationstutorial für MySQL 8.0.12 winx64

In diesem Artikel finden Sie das Installations-Tu...

Erweiterte Closures in JavaScript erklärt

Inhaltsverzeichnis 1. Das Konzept der Schließung ...

JS implementiert den Beispielcode der Dezimalkonvertierung in Hexadezimal

Vorwort Beim Schreiben von Code stoßen wir gelege...