看到网上的一个问题:为什么下面这条语句没有使用索引
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'再验证,妥妥的使用了索引。
总结:要尽量避免出现这种隐式转换。