重要な点は、データベースが比較のテーブル側で変換を行う必要がある場合、インデックスは使用できないということです。
それに加えて、これは決定論的な方法であるため、DBは常に文字列->数値を隠蔽します(そうでない場合、コメントで言及されているように、1は「01」、「001」に変換される可能性があります)。
したがって、混乱していると思われる2つのケースを比較すると、次のようになります。
-- index is used
EXPLAIN SELECT * FROM a_table WHERE int_column = '1';
DBは、文字列「1」を数値1に変換してから、クエリを実行します。インデックスを使用できるように、最終的に両側にintがあります。
-- index is NOT used. WTF?
EXPLAIN SELECT * FROM a_table WHERE str_column = 1;
ここでも、文字列を数値に変換します。ただし、今回はテーブルに格納されているデータを変換する必要があります。実際、cast(str_column as int) = 1
のような検索を実行しています。 。つまり、インデックス付きデータを検索しなくなったため、DBはできません インデックスを使用します。
詳細については、こちらをご覧ください:
- 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