Open2
SQL 暗黙の型変換
暗黙の型変換とは
SQL の実行中に異なるデータ型の値が自動的に他の型に変換される現象のこと。
DBMS によって自動的に行われる。
インデックスが効かなくなる
下記の例では文字列型のnameが暗黙的に数値型に変換されてしまっており、インデックスが効いてません。
explain select * from users where name = 10;
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
| 1 | SIMPLE | users | NULL | ALL | name_index | NULL | NULL | NULL | 120 | 10.00 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
◯ 対処法
これを回避するためには、インデックスのある列が型変換されないように修正する必要があります。
# 条件に使用している値を列のデータ型に合わせる
mysql> explain select * from users where name = '10';
mysql> explain select * from users where name = cast(10 as char(2));
+----+-------------+-------+------------+------+---------------+------------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------------+---------+-------+------+----------+-------+
| 1 | SIMPLE | users | NULL | ref | name_index | name_index | 403 | const | 1 | 100.00 | NULL |
+----+-------------+-------+------------+------+---------------+------------+---------+-------+------+----------+-------+
暗黙の型変換には落とし穴があるっぽい