比如说,我有一张表:
create table test (
id int primary key auto_increment,
c_no varchar(11),
c2 varchar(2),
key c_no(c_no)
);
然后基于这个表,我有一个sql查询,它是:
select
*
from
test
where
c_no = 100
但是当我使用explain分析sql时,我发现它没有使用c_no上的索引:
explain select * from test2 where c_no=100
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
| 1 | SIMPLE | test | NULL | ALL | c_no | NULL | NULL | NULL | 7 | 14.29 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
1 row in set, 3 warnings (0.00 sec)
为甚么?
1条答案
按热度按时间mitkmikd1#
当列数据类型为
VARCHAR()
时,需要用引号将搜索值括起来,以便使用索引。因此,代替:
..尝试:
Check the difference in this demo fiddle
至于 “为什么?",我真的没有确切的答案,因为当我发现这一点时,我并不关心为什么。但是,我假设您正在
VARCHAR()
列上搜索一个数字(INT
?)数据类型,这是不匹配的,所以这就是为什么它不能将=100
识别为varchar。Here's what happen if
c_no
column datatype isINT