因为本质上in就是多个=,用or连接起来。
同事写了一条SQL语句,我一看,哦买糕的,居然用了4层嵌套的in。
他一定是刚刚学会了IN的用法,尝到甜头了,泛滥成灾,一发不可收拾。没有说不给用IN,既然系统提供了这种语法,肯定有它的用途和适用场景。但我好像以前从什么地方看过,说IN效率不高。考察同事这条语句,其实用联接就可以,没必要用IN。
联接应当是SQL里最基础,最常用的操作了。联接的高效我有体会。许多年前,我在SQL SERVER里写存储过程做一些数据运算。开始是用双循环,跑完整个存储过程要20分钟;改用联接,速度提升到5分钟。数据库本身是有做一些优化的,比我们自己用所谓循环,什么操作提到循环外这种土办法不知道强多少倍了。
但回到这里,为什么说IN效率不高呢?我不是很清楚。虽然以前用数据库比较多,但我说不出个子丑寅卯。网上很多文章都说IN效率不高,不过没有给出原因。继续寻寻觅觅,发现有个回答简洁明了:
in的效率是比较低的,但不大会和LEFT JOIN做比较,一般是和exists做比较的。
in的实质就是无数个=,中间用OR连接起来
比如IN (1,2,3)实质上就是=1 or =2 or =3,效率自然不高
说得真好!