为什么说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')))
他一定是刚刚学会了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性能不高?相关推荐
- sql语句中使用函数会耗费性能吗_挽救数据库性能的 30 条黄金法则 | 原力计划...
作者 | geekguy 责编 | 王晓曼 出品 | CSDN博客 1. 优化查询,应尽量避免全表扫描,应该在用于检索数据和排序数据的字段上建立索引,如where子句用于搜索,order by子句用于 ...
- Sql 语句中 IN 和 EXISTS
原文链接: (2条消息)Sql 语句中 IN 和 EXISTS 的区别及应用 - jcpp9527的博客 - CSDN博客 https://blog.csdn.net/wqc19920906/art ...
- mysql语句中limt_mysql sql语句中的limit用法
mysql sql语句中的limit用法 1.select * from tablename limit 100,15 从100条记录后开始(不包括第100条记录)取出15条记录 (实际取出的是第 1 ...
- SQL语句优化优化数据库性能
在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统的响应速度就成为 ...
- SQL语句中explain各字段含义
SQL语句中explain各字段含义 1 id: 2 select_type 3 type 4 table 5 possible_keys 6 Key key列显示MySQL实际决定使用的键(索引) ...
- 18为什么这些 SQL 语句逻辑相同,性能却差异巨大?
18| 为什么这些 SQL 语句逻辑相同,性能却差异巨大? 文章目录 18| 为什么这些 SQL 语句逻辑相同,性能却差异巨大? 案例一:条件字段函数操作 案例二:隐式类型转换 案例三:隐式字符编码转 ...
- sql语句中的case语句
sql语句中的case语句与高级语言中的switch语句,是标准sql的语法,适用于一个条件判断有多种值的情况下分别执行不同的操作. 首先,让我们看一下CASE的语法.在一般的SELECT中,其语法格 ...
- sql语句中left join和inner join中的on与where的区别分析
原文:sql语句中left join和inner join中的on与where的区别分析 关于SQL SERVER的表联接查询INNER JOIN .LEFT JOIN和RIGHT JOIN,经常会用 ...
- oracle修改表结构的sql命令是什么,sql语句中修改表结构的命令是什么?
sql语句中修改表结构的命令是:"ALTER TABLE"命令. ALTER TABLE 语句用于在已有的表中添加.删除或修改列. SQL ALTER TABLE 语法 如需在表中 ...
最新文章
- 建立一个按年龄排序的有序链表,每个结点包括学号、姓名、性别、年龄。建立一个新的结点,通过年龄将此结点插入到链表中去,使之仍然有序
- Caffe实践】如何利用Caffe训练ImageNet分类网络
- Facebook市值赶超股神巴菲特公司 全美排名第五
- Openstack Neutron 管理的网络资源
- Vim和Vi的常用命令
- LeetCode 312. 戳气球(Burst Balloons)
- torchvision学习之torchvision.datasets
- 开发者中的领导与管理(译文)
- Linux 命令源码 —— cat
- FPGA基础知识13(二级D触发器应用于同步器,减少亚稳态)
- 在tomcat里面配置数据库地址,以及在Spring和Java中的使用
- Auto.js Pro安卓免ROOT引流脚本开发系列教程28网易公开课(6)-取随机话术
- 荣耀V40用机技巧有哪些
- 番茄炖牛腩做法,味美汤浓开胃爽口,牛腩入口即化,太下饭!
- ios设备苹果手机 js时间字符串转时间戳后显示错误NAN
- 冒泡排序法(C语言实现)
- linux l7,linux 下安装l7_filter
- CodeForces 888G Xor-MST (异或最小生成树+01trie)
- 微服务 - IaaS/PaaS/SaaS/BaaS - B2C/B2B
- 发福利:整理了一份关于“资源汇总”的汇总