因为本质上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')))

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

说得真好!

为什么说SQL语句中使用IN性能不高?相关推荐

  1. sql语句中使用函数会耗费性能吗_挽救数据库性能的 30 条黄金法则 | 原力计划...

    作者 | geekguy 责编 | 王晓曼 出品 | CSDN博客 1. 优化查询,应尽量避免全表扫描,应该在用于检索数据和排序数据的字段上建立索引,如where子句用于搜索,order by子句用于 ...

  2. Sql 语句中 IN 和 EXISTS

    原文链接:  (2条消息)Sql 语句中 IN 和 EXISTS 的区别及应用 - jcpp9527的博客 - CSDN博客 https://blog.csdn.net/wqc19920906/art ...

  3. mysql语句中limt_mysql sql语句中的limit用法

    mysql sql语句中的limit用法 1.select * from tablename limit 100,15 从100条记录后开始(不包括第100条记录)取出15条记录 (实际取出的是第 1 ...

  4. SQL语句优化优化数据库性能

    在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统的响应速度就成为 ...

  5. SQL语句中explain各字段含义

    SQL语句中explain各字段含义 1 id: 2 select_type 3 type 4 table 5 possible_keys 6 Key key列显示MySQL实际决定使用的键(索引) ...

  6. 18为什么这些 SQL 语句逻辑相同,性能却差异巨大?

    18| 为什么这些 SQL 语句逻辑相同,性能却差异巨大? 文章目录 18| 为什么这些 SQL 语句逻辑相同,性能却差异巨大? 案例一:条件字段函数操作 案例二:隐式类型转换 案例三:隐式字符编码转 ...

  7. sql语句中的case语句

    sql语句中的case语句与高级语言中的switch语句,是标准sql的语法,适用于一个条件判断有多种值的情况下分别执行不同的操作. 首先,让我们看一下CASE的语法.在一般的SELECT中,其语法格 ...

  8. sql语句中left join和inner join中的on与where的区别分析

    原文:sql语句中left join和inner join中的on与where的区别分析 关于SQL SERVER的表联接查询INNER JOIN .LEFT JOIN和RIGHT JOIN,经常会用 ...

  9. oracle修改表结构的sql命令是什么,sql语句中修改表结构的命令是什么?

    sql语句中修改表结构的命令是:"ALTER TABLE"命令. ALTER TABLE 语句用于在已有的表中添加.删除或修改列. SQL ALTER TABLE 语法 如需在表中 ...

最新文章

  1. 建立一个按年龄排序的有序链表,每个结点包括学号、姓名、性别、年龄。建立一个新的结点,通过年龄将此结点插入到链表中去,使之仍然有序
  2. Caffe实践】如何利用Caffe训练ImageNet分类网络
  3. Facebook市值赶超股神巴菲特公司 全美排名第五
  4. Openstack Neutron 管理的网络资源
  5. Vim和Vi的常用命令
  6. LeetCode 312. 戳气球(Burst Balloons)
  7. torchvision学习之torchvision.datasets
  8. 开发者中的领导与管理(译文)
  9. Linux 命令源码 —— cat
  10. FPGA基础知识13(二级D触发器应用于同步器,减少亚稳态)
  11. 在tomcat里面配置数据库地址,以及在Spring和Java中的使用
  12. Auto.js Pro安卓免ROOT引流脚本开发系列教程28网易公开课(6)-取随机话术
  13. 荣耀V40用机技巧有哪些
  14. 番茄炖牛腩做法,味美汤浓开胃爽口,牛腩入口即化,太下饭!
  15. ios设备苹果手机 js时间字符串转时间戳后显示错误NAN
  16. 冒泡排序法(C语言实现)
  17. linux l7,linux 下安装l7_filter
  18. CodeForces 888G Xor-MST (异或最小生成树+01trie)
  19. 微服务 - IaaS/PaaS/SaaS/BaaS - B2C/B2B
  20. 发福利:整理了一份关于“资源汇总”的汇总

热门文章

  1. dataType和contentType的区别
  2. 目标检测:PASCAL VOC 数据集简介
  3. 科技作者吴军:不用低效率的算法做事情
  4. CSDN(编程的开始)
  5. 2.zookeeper客户端使用与集群特性
  6. ticklength
  7. 红旗linux考试,红旗Linux认证考试介绍
  8. SQLyog连接linux数据库问题
  9. k8s原生的CI/CD工具tekton
  10. 曲线图chart.js插件例子