为什么mysql不使用索引,而索引是基于varchar字段的?

utugiqy6  于 2023-03-07  发布在  Mysql
关注(0)|答案(1)|浏览(113)

比如说,我有一张表:

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)

为甚么?

mitkmikd

mitkmikd1#

当列数据类型为VARCHAR()时,需要用引号将搜索值括起来,以便使用索引。
因此,代替:

select *  from test where c_no=100;

..尝试:

select *  from test where c_no='100';

Check the difference in this demo fiddle
至于 “为什么?",我真的没有确切的答案,因为当我发现这一点时,我并不关心为什么。但是,我假设您正在VARCHAR()列上搜索一个数字(INT?)数据类型,这是不匹配的,所以这就是为什么它不能将=100识别为varchar。
Here's what happen if c_no column datatype is INT

相关问题