2017-05-25 68 views
1

我在使用单引号执行查询时没有观察到单行引号的不同行为。为什么选择查询行为与单引号不同,在哪里条件且没有单引号

用单引号('121')我很快得到了结果,查询使用的索引很好。但没有单引号,查询不使用索引,响应时间很长。

mysql> explain select * from tbl_n1 where id =121; 
+----+-------------+----------------------+------+---------------+------+---------+------+--------+-------------+ 
| id | select_type | table    | type | possible_keys | key | key_len | ref | rows | Extra  | 
+----+-------------+----------------------+------+---------------+------+---------+------+--------+-------------+ 
| 1 | SIMPLE  | tbl_n1    | ALL | n1_id  | NULL | NULL | NULL | 286929 | Using where | 
+----+-------------+----------------------+------+---------------+------+---------+------+--------+-------------+ 
1 row in set (0.00 sec) 

mysql> explain select * from tbl_n1 where id ='121'; 
+----+-------------+----------------------+------+---------------+----------+---------+-------+------+-------------+ 
| id | select_type | table    | type | possible_keys | key  | key_len | ref | rows | Extra  | 
+----+-------------+----------------------+------+---------------+----------+---------+-------+------+-------------+ 
| 1 | SIMPLE  | tbl_n1    | ref | n1_id  | n1_id | 53  | const | 29 | Using where | 
+----+-------------+----------------------+------+---------------+----------+---------+-------+------+-------------+ 
1 row in set (0.00 sec) 


show create table tbl_n1\G 
.... 
.... 
`id` varchar(10) DEFAULT NULL, 
.... 
.... 
.... 
+0

没问题,我会删除评论和感谢! –

回答

5

由于场id的定义是varchar,而不单引号的数据库将不得不作出一个隐式转换将铸造领域id(或其他功能将其转换为varchar),其将阻止使用索引idx_1055

的阅读这篇文章吧:Type Conversion in Expression Evaluation

+1

我想知道为什么它不会将右侧的值转换为字符串?在这种情况下,它可以使用索引。 –

+1

我同意还是很奇怪的。在postgres中,隐式转换将是一个常量,并仍然使用索引。 –

+0

是的,它可以检查什么是最佳匹配,并进行适当的转换,以便使用索引。我想这只是MySql人员实现它的方式。 –

相关问题