当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,在几百万条数据情况下,不走索引,系统会认为不走索引速度更快一些,所以选择不走索引。

原文地址:https://www.cnblogs.com/turbo30/p/13696659.html