mysql in/not in 探究 究竟能不能使用in

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前得结果集不能太大),效率低下要全表扫描

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值