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

Detaillierte Erklärung der React-Ereignisbindung

1. Was ist In react Anwendungen werden Ereignisna...

Eine kurze Analyse des Unterschieds zwischen ref und toRef in Vue3

1. ref wird kopiert, die Ansicht wird aktualisier...

...

Mehrere Gründe, HTML nicht zu komprimieren

Der Grund ist einfach: In HTML-Dokumenten entsprec...

Was sind die Verwendungszwecke von Limits in MySQL (empfohlen)

SELECT * FROM Tabellenname Limit m,n; SELECT * FR...

JS realisiert Spezialeffekte der Webseiten-Navigationsleiste

In diesem Artikel erfahren Sie mehr über einen pr...

Lösung für das Problem mit verstümmeltem MySQL-Code unter Linux

Das Projekt interagiert mit dem Server, greift üb...

Beheben des Problems, dass Notizendetails auf Webseiten grau werden

1. Wenn im Internet Explorer die relative Position...

Beispiele für ES6-Schleifen und iterierbare Objekte

Dieser Artikel untersucht die ES6-for...of-Schlei...

Referenzschreiben im JS- und CSS-Stil

CSS: 1. <link type="text/css" href=&q...

Mysql 5.6.37 Winx64-Installation Dual-Version MySQL-Hinweise

Wenn MySQL Version 5.0 bereits auf dem Computer v...