Najważniejsze jest to, że indeks nie może być użyty, jeśli baza danych musi wykonać konwersję po stronie tabeli porównania.
Poza tym DB zawsze ukrywa Ciągi -> Liczby, ponieważ jest to deterministyczny sposób (w przeciwnym razie 1 można by przekonwertować na '01', '001', jak wspomniano w komentarzach).
Tak więc, jeśli porównamy dwa przypadki, które wydają się być zdezorientowane:
-- index is used
EXPLAIN SELECT * FROM a_table WHERE int_column = '1';
DB konwertuje ciąg '1' na liczbę 1, a następnie wykonuje zapytanie. W końcu ma int po obu stronach, więc może korzystać z indeksu.
-- index is NOT used. WTF?
EXPLAIN SELECT * FROM a_table WHERE str_column = 1;
Ponownie konwertuje ciąg na liczby. Jednak tym razem musi przekonwertować dane zapisane w tabeli. W rzeczywistości przeprowadzasz wyszukiwanie takie jak cast(str_column as int) = 1
. Oznacza to, że nie wyszukujesz już zindeksowanych danych, DB nie może użyj indeksu.
Proszę spojrzeć na to, aby uzyskać więcej informacji:
- http://use-the- index-luke.com/sql/where-clause/obfuscation/numeric-strings
- http://use- the-index-luke.com/sql/where-clause/functions/case-in sensitive-search