Det väsentliga är att indexet inte kan användas om databasen måste göra en konvertering på tabellsidan av jämförelsen.
Dessutom döljer DB alltid Strings -> Numbers eftersom detta är det deterministiska sättet (annars kan 1 konverteras till '01', '001' som nämnts i kommentarerna).
Så om vi jämför de två fallen som verkar förvirra dig:
-- index is used
EXPLAIN SELECT * FROM a_table WHERE int_column = '1';
DB:n konverterar strängen '1' till siffran 1 och exekverar sedan frågan. Den har äntligen int på båda sidor så att den kan använda indexet.
-- index is NOT used. WTF?
EXPLAIN SELECT * FROM a_table WHERE str_column = 1;
Återigen konverterar den strängen till siffror. Den här gången måste den dock konvertera data som lagras i tabellen. Faktum är att du utför en sökning som cast(str_column as int) = 1
. Det betyder att du inte längre söker på den indexerade informationen, DB kan inte använd indexet.
Ta en titt på detta för mer information:
- 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