in:某个列的多条件查询
eg: 查询id为1,2,3,4的用户所有信息 => select * from user where id in(1,2,3,4)
not in: 语义相反
eg: 查询id不为1,2,3,4的用户所有信息 => select * from user where id not in(1,2,3,4)
关于in到底能不能用索引的问题,其他资料也很详细下面探究究竟能不能用in 普遍认为in
的参数为一个的时候,索引效率最高,当参数越多时效率越低
但我发现,无论是参数个数有多少,其实效率都是很高的,但是需要注意的是in的个数不确定会导致sql的长度不确定,有可能会导致sql过于长从而报sql最大的包超出异常,一般不会超出.下面论证
前提:表user 主键id 数据>1000万条
1.一个参数 explain结果如下图
explain select * from user where id in(3000000)
2.多个参数 explain结果如下图(使用索引,且效率很高) sql 查询时间 0.030s
explain select * from user where id in(10000000,2000000,40000000,5555555,88888,6666423,6346777,88999,11211231)
3.多个参数,效率低下(错误的),关于这个说法很多地方都有说到,由于我的user表中有1000多万的数据无法直接论述这个观点,现新建test表,只有几条数据
explain select * from test where id in(1,2,3,4,5,6,7)
下面结果可以看到type类型为all 效率的确低下,但是这个情况只有参数的数量大约为表中的数据量的一半的时候才会出现全表扫描,而实际应用中根本不会出现这种情况,不可能我有1000万条数据要取出500万条,如果要取出500万条那还用什么索引呢.
4 not in 效率低下,一般不会使用
explain select * from user where id not in(10000000,2000000,40000000,5555555,88888,6666423,6346777,88999,11211231)
结论:可以使用in 而且效率很高,大数据量下依然很快,但in要注意长度,避免sql长度超出mysql 最大包限制
尽量避免使用 not in(使用not in前得结果集不能太大),效率低下要全表扫描