SQL中隐式转换导致无法使用索引

看到网上的一个问题:为什么下面这条语句没有使用索引
select * from user where phone = 13811223344;
为此我们来做个小测试。创建一个user表,表中有4列,注意 phone列的类型为varchar,且该列上创建了索引。
mysql> show create table user;
+-----------+-----------------------------------------------------+
| Table | Create Table |
+-----------+-----------------------------------------------------+
| big_table | CREATE TABLE `big_table` (
`id` int(11) NOT NULL DEFAULT '0',
`name` varchar(10) DEFAULT NULL,
`phone` varchar(20) DEFAULT NULL,
`addr` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `name` (`name`),
KEY `idx_phone` (`phone`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-----------+-----------------------------------------------------+

 

然后我们插入一些数据,其中phone为123466121有一条数据。
mysql> select * from big_table where phone = 123466121;
+------+----------+---------------------+----------------------+
| id     | name          | phone        | addr                   |
+------+----------+---------------------+----------------------+
| 9332 | dong9332 | 123466121 | addr123466121 |
+------+----------+---------------------+----------------------+
1 row in set (0.00 sec)

 

这个时候,我们验证一下,发现果然没有使用索引。

 

这是为什么呢?
前面有强调,phone的类型是varchar,字符型!而后面的值并不是字符。这就需要隐式转换,导致phone列无法使用索引。
当用'123466121'再验证,妥妥的使用了索引。

总结:要尽量避免出现这种隐式转换。

posted @ 2018-06-25 16:29  AYard  阅读(58)  评论(0编辑  收藏