前言
IN 和 NOT IN 是比较常用的关键字,为什么要尽量避免呢?
一、为什么尽量不要用in和not in?
以下是关于为什么尽量避免使用 in
和 not in
的一些原因:
-
性能问题:对于大型数据结构,
in
和not in
操作可能相对较慢。这是因为它们通常需要遍历整个序列来查找元素。对于列表和元组,这是线性的时间复杂度(O(n)),而对于集合和字典,这通常是常数时间复杂度(O(1))。因此,如果你在一个很大的列表中频繁地使用in
或not in
,可能会遇到性能瓶颈。 -
可读性:虽然
in
和not in
语义清晰,但在某些复杂的逻辑中过度使用可能会降低代码的可读性。特别是当与多个条件或嵌套结构结合使用时,代码可能会变得难以理解和维护。 -
替代方案:对于某些情况,可能存在更高效的替代方案。例如,如果你需要检查一个元素是否存在于一个集合中,那么使用集合而不是列表会更快。同样,如果你需要频繁地检查元素是否存在,考虑使用字典或集合来存储元素,这样可以在常数时间内完成查找。
-
潜在错误:在某些情况下,使用
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在小数据量语句中,用用没什么,但数据量大了,就会有问题。在面试和在应对大数据量时,尽量不要使用,骗人是小狗。