Open2

SQL 暗黙の型変換

match1124match1124

暗黙の型変換とは

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  |
+----+-------------+-------+------------+------+---------------+------------+---------+-------+------+----------+-------+