当sex字段是int或者char类型,select * from user where sex=1这种会走索引吗?

常见type级别

system > const > eq_ref > ref > range > index > ALL

越往左边,性能越高,比如system就比ALL类型性能要高出许多,其中system、const只是理想类型,基本达不到;我们自己实际能优化到ref>range这两个类型,就是你自己写SQL,如果你没优化基本上就是ALL,如果你优化了,那就尽量达到ref>range这两个级别。

当sex字段为char类型

首先咱们先建表

CREATE DATABASE student;
CREATE TABLE stu(
   `id` INT PRIMARY KEY,
   `sex` CHAR,
   KEY `idx_sex` (`sex`) USING BTREE		
)ENGINE=INNODB DEFAULT CHARSET=utf8;

insert into stu valuse(1,'0'),(2,'0'),(3,'1');

咱们给sex字段加了B树索引

char类型 加单引号与不加区别

EXPLAIN SELECT * FROM stu WHERE sex=1;


可以查看到,type为index,查询行数3条,即将所有记录都查询了一遍所以不会走索引!!!!

EXPLAIN SELECT * FROM stu WHERE sex='1';


加了单引号,走了索引,type为ref级别,查询行数1条。所以会走索引

当sex字段为int类型

首先咱们先建表

CREATE DATABASE student;
CREATE TABLE stu(
   `id` INT PRIMARY KEY,
   `sex` INT,
   KEY `idx_sex` (`sex`) USING BTREE		
)ENGINE=INNODB DEFAULT CHARSET=utf8;

insert into stu valuse(1,'0'),(2,'0'),(3,'1');

int类型 加单引号与不加区别

EXPLAIN SELECT * FROM stu WHERE sex=1;

EXPLAIN SELECT * FROM stu WHERE sex='1';


两条语句执行结果可知,数据类型为int类型,不管加不加单引号,都会走索引,type级别都为ref

总结

  • 当查询的类型与字段类型不一致时,不会走索引。
  • int类型无论加没有加引号都会走索引。
  • 为了避免不走索引,最好还是使得查询的类型与字段类型一致。

TIP

2020年9月25日 面试项目经理告诉我,sex=1,在几百万条数据情况下,不走索引,系统会认为不走索引速度更快一些,所以选择不走索引。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值