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