Podstatné je, že index nelze použít, pokud databáze musí provést konverzi na straně tabulky srovnání.
Kromě toho DB vždy skrývá Strings -> Numbers, protože toto je deterministický způsob (jinak by 1 mohla být převedena na '01', '001', jak je uvedeno v komentářích).
Pokud tedy porovnáme dva případy, které vás zmást:
-- index is used
EXPLAIN SELECT * FROM a_table WHERE int_column = '1';
DB převede řetězec '1' na číslo 1 a poté provede dotaz. Konečně má na obou stranách int, takže může používat index.
-- index is NOT used. WTF?
EXPLAIN SELECT * FROM a_table WHERE str_column = 1;
Opět převede řetězec na čísla. Tentokrát však musí převést data uložená v tabulce. Ve skutečnosti provádíte vyhledávání jako cast(str_column as int) = 1
. To znamená, že už v indexovaných datech nevyhledáváte, DB to nemůže použijte index.
Další podrobnosti naleznete zde:
- 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