答案是:看in后面跟的条件和扫描行的比例
目录
这里测试把后面的条件: a、b换成 demo02、demo03
准备条件
- maridb:10.2.37-MariaDB-log
- DDL
-- auto-generated definition
create table user
(
id int(32) auto_increment
primary key,
name varchar(32) null,
age int(32) null,
des varchar(32) null
);
create index user_name_index
on user (name);
----------------------------------------------------------------------------------
INSERT INTO mybatis.user (id, name, age, des) VALUES (1, 'wuliuqi', 27, 'wuliuqi');
INSERT INTO mybatis.user (id, name, age, des) VALUES (3, 'demo01', 26, 'demo01');
INSERT INTO mybatis.user (id, name, age, des) VALUES (4, 'demo02', 26, 'demo02');
INSERT INTO mybatis.user (id, name, age, des) VALUES (5, 'demo03', 26, 'demo03');
INSERT INTO mybatis.user (id, name, age, des) VALUES (6, 'demo04', 26, 'demo04');
INSERT INTO mybatis.user (id, name, age, des) VALUES (7, 'demo05', 26, 'demo05');
INSERT INTO mybatis.user (id, name, age, des) VALUES (8, 'demo06', 26, 'demo06');
INSERT INTO mybatis.user (id, name, age, des) VALUES (9, 'demo07', 26, 'demo07');
鉴定过程
编写查询sql语句,查看执行计划:
explain select * from user where name in ('demo01')
这时候我们看到sql执行计划显示用到了我们针对name创建的索引;但是是不是一定会走索引呢????
这里吧in后面的数据范围变大:
explain select * from user where name in ('demo01', 'a', 'b')
通过执行计划看得出这个时候已经不再走索引了,可能是因为in后面跟的数据不在表中导致的吗????
这里测试把后面的条件: a、b换成 demo02、demo03
explain select * from user where name in ('demo01', 'demo02', 'demo03')
通过上面的测试可以得到总结是:
1、没有走索引
2、和in后面的数据是不是在表中的已有条件无关
in条件内容重复,数据量变多
explain select * from user where name in ('d', 'dem', 'd', 'd')
总结:
走不走索引这个和条件后面的数据量有关系,mysql底层对于后面的条件很可能做了数据重复处理;参考别人博客解释道条件范围占总数据的30%左右的时候会进行全表扫描,放弃执行索引的方式;通过测试可以看出,里面可能还涉及到对后面的数据去重之后的结果占比的判定!