Het essentiële punt is dat de index niet kan worden gebruikt als de database een conversie moet doen aan de tabelzijde van de vergelijking.
Daarnaast dekt de DB altijd Strings -> Numbers omdat dit de deterministische manier is (anders zou 1 kunnen worden omgezet in '01', '001' zoals vermeld in de opmerkingen).
Dus, als we de twee gevallen vergelijken die u in verwarring lijken te brengen:
-- index is used
EXPLAIN SELECT * FROM a_table WHERE int_column = '1';
De DB converteert de string '1' naar het nummer 1 en voert vervolgens de query uit. Het heeft eindelijk int aan beide kanten, zodat het de index kan gebruiken.
-- index is NOT used. WTF?
EXPLAIN SELECT * FROM a_table WHERE str_column = 1;
Nogmaals, het converteert de string naar getallen. Deze keer moet het echter de gegevens die in de tabel zijn opgeslagen, converteren. In feite voert u een zoekopdracht uit zoals cast(str_column as int) = 1
. Dat betekent dat u niet meer zoekt op de geïndexeerde gegevens, de DB kan niet gebruik de index.
Bekijk dit voor meer informatie:
- 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