Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL:Vergleich von Integer-Wert und String-Feld mit Index

Der wesentliche Punkt ist, dass der Index nicht verwendet werden kann, wenn die Datenbank eine Konvertierung auf der Tabellenseite des Vergleichs durchführen muss.

Außerdem verdeckt die DB immer Strings -> Numbers, da dies der deterministische Weg ist (andernfalls könnte 1 in '01', '001' umgewandelt werden, wie in den Kommentaren erwähnt).

Wenn wir also die beiden Fälle vergleichen, die Sie zu verwirren scheinen:

-- index is used
EXPLAIN SELECT * FROM a_table WHERE int_column = '1';

Der DB wandelt den String '1' in die Zahl 1 um und führt dann die Abfrage aus. Endlich hat es auf beiden Seiten int, damit es den Index verwenden kann.

-- index is NOT used. WTF?
EXPLAIN SELECT * FROM a_table WHERE str_column = 1;

Auch hier wird die Zeichenfolge in Zahlen umgewandelt. Diesmal muss es jedoch die in der Tabelle gespeicherten Daten konvertieren. Tatsächlich führen Sie eine Suche wie cast(str_column as int) = 1 durch . Das heißt, Sie suchen nicht mehr nach den indizierten Daten, die DB kann nicht Verwenden Sie den Index.

Weitere Einzelheiten finden Sie hier: