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:
- http://use-the- index-luke.com/sql/where-clause/obfuscation/numeric-strings
- http://use- the-index-luke.com/sql/where-clause/functions/case-insensitive-search