sql >> データベース >  >> RDS >> Mysql

MySQL:整数値と文字列フィールドとインデックスの比較

    重要な点は、データベースが比較のテーブル側で変換を行う必要がある場合、インデックスは使用できないということです。

    それに加えて、これは決定論的な方法であるため、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はできません インデックスを使用します。

    詳細については、こちらをご覧ください:




    1. Mysqlトランザクション:コミットとロールバック

    2. グループのMAX日付レコードに参加しています

    3. JSONファイルをPostgreSQLにインポートするにはどうすればよいですか?

    4. TypeError:'int'オブジェクトはインデックス作成をサポートしていません