WHCSRL 技术网

为什么说SQL语句中使用IN性能不高?_左直拳的马桶

因为本质上in就是多个=,用or连接起来。

同事写了一条SQL语句,我一看,哦买糕的,居然用了4层嵌套的in。

SELECT * FROM    "publicDB"."system_action" WHERE ACTION_ID IN(
        SELECT ACTION_ID FROM  "publicDB"."system_action_role" WHERE ROLE_ID IN
        (  SELECT ROLE_ID FROM "publicDB".base_role_user WHERE USER_ID  IN(SELECT USER_ID FROM "publicDB"."base_user" WHERE USER_NAME='huxin')))
  • 1
  • 2
  • 3

他一定是刚刚学会了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,效率自然不高

说得真好!

推荐阅读