谁再在 SQL 中写 in 和 not in,直接走人!

文章讨论了在处理大数据时应避免使用in和notin的原因,包括性能瓶颈、可读性降低以及不能命中索引等问题,推荐使用EXISTS、NOTEXISTS和JOIN等替代方法以提高查询效率。
摘要由CSDN通过智能技术生成

前言

IN 和 NOT IN 是比较常用的关键字,为什么要尽量避免呢?

一、为什么尽量不要用in和not in?

以下是关于为什么尽量避免使用 in 和 not in 的一些原因:

  1. 性能问题:对于大型数据结构,in 和 not in 操作可能相对较慢。这是因为它们通常需要遍历整个序列来查找元素。对于列表和元组,这是线性的时间复杂度(O(n)),而对于集合和字典,这通常是常数时间复杂度(O(1))。因此,如果你在一个很大的列表中频繁地使用 in 或 not in,可能会遇到性能瓶颈。

  2. 可读性:虽然 in 和 not in 语义清晰,但在某些复杂的逻辑中过度使用可能会降低代码的可读性。特别是当与多个条件或嵌套结构结合使用时,代码可能会变得难以理解和维护。

  3. 替代方案:对于某些情况,可能存在更高效的替代方案。例如,如果你需要检查一个元素是否存在于一个集合中,那么使用集合而不是列表会更快。同样,如果你需要频繁地检查元素是否存在,考虑使用字典或集合来存储元素,这样可以在常数时间内完成查找。

  4. 潜在错误:在某些情况下,使用 in 和 not in 可能会导致意外的结果。例如,如果你在一个包含可变对象的列表中使用 in,那么即使对象的内容已经改变,in 检查仍然可能返回True,因为 in 是基于对象的标识(即内存地址)而不是值来工作的。

假如 a 表 和 b表  都是100w条数据,700M的样子,都不算大。

select * from a where work not in (select work from b)

直接就把我跑傻了,十几分钟,检查了一下在两个表都建了索引,字段类型也是一样的。原来not in 是不能命中索引的。改成 NOT EXISTS 之后查询 20s ,效率真的差好多。

二、怎么办?

用 EXISTS 或 NOT EXISTS 代替

select * from t1
where EXISTS(select* from t2 where id2 = id1)

select * FROM t1
where NOT EXISTS(select * from t2 where id2 =id1 )

或者用join代替

select idl from t1
INNER JOIN t2 oN id2 = id1

select idl from t1
LEFT JOIN t2 ON id2 = id1
where id2 IS NULL

总结

in和not in在小数据量语句中,用用没什么,但数据量大了,就会有问题。在面试和在应对大数据量时,尽量不要使用,骗人是小狗。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值