mysql exists in join_子查询、left join、 exists 替代 not in

如果要实现一张表有而另外一张表没有的数据时,我们通常会这么写:

SELECT id FROM user WHERE id NOT IN (SELECT id FROM student)

not in不会走索引, 可以用exists替代

SELECT id FROM user WHERE NOT exists (SELECT id FROM student WHERE user.id = student.id)

也可以用left join替代

SELECT id FROM user LEFT JOIN student ON user.id = student.id WHERE student.id = null

in: 是把外表和内表作hash 连接,在将user.id = student.id的数据保留;这样当子查询记录多时,hash连接后的数据量是特别大的。

EXISTS: 包括 NOT EXISTS子句的返回值是一个Boolean值; EXISTS先查出user表,将每一条记录的id带入子查询,根据查询返回的结果是否空值来确定当条记录是否加入结果集。exists是对外表作loop循环,每次loop循环再对子表进行查询。这样子表的查询语句会执行 (外表查出的记录数) 次; 所以一直以来认为exists比in效率高的说法是不准确的。

可以理解为:将外查询表的每一行,代入子查询作为检验,如果子查询返回的结果取非空值,则EXISTS子句返回TRUE,这一行可作为外查询的结果行,否则不能作为结果。

in 和 exists的区别场景:

IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。

如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in, 反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了 ,另外IN时不对NULL进行处理。

EXISTS与IN的使用效率的问题,通常情况下采用exists要比in效率高,因为IN不走索引,但要看实际情况具体使用

而not in 和not exists: 如果查询语句使用了not in 那么内外表都进行全表扫描(hash连接后的数据进行逐条判断user.id = student.id是否成立),不会用到索引; 而not exists 的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。

子查询

MySQL从4.1版本开始支持子查询,使用子查询进行SELECT语句嵌套查询,可以一次完成很多逻辑上需要多个步骤才能完成的SQL操作。

缺点:

子查询虽然很灵活,但是执行效率并不高,原因:执行子查询时,MySQL需要创建临时表,查询完毕后再删除这些临时表,所以,子查询的速度会受到一些影响,这里多了一个创建和销毁临时表的过程。对子查询结果进行操作时索引会失效

优化方式:

可以使用JOIN、LEFT JOIN等方式代替子查询,这些方式不需要建立临时表,因此速度比子查询快。

扩展

在插入记录前,需要检查这条记录是否已经存在,只有当记录不存在时才执行插入操作,可以通过使用 EXISTS 条件句防止插入重复记录。

inset into user(username)select '123456' from dual where not EXISTS (select username from user where username='123456')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/514773.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华云数据升级发布“信创云基座“ 用“全芯全栈”支持“信创强国”

2021年6月10日,北京——2021年是我国“十四五”规划的开局之年,也是我国“加快数字发展 建设数字中国”的关键之年。值此历史交汇的关键点,云计算、大数据、人工智能、物联网、工业互联网、区块链等重点产业将对国家数字经济发展起到巨大推动…

最IN的云原生架构,阿里云 Serverless 事件总线 EventBridge 重磅发布

简介: Serverless 是云计算下一个10年的主要形态,通过大量端到端的整合和云服务的集成,能极大地提高研发效率。了解阿里云 Serverless 产品家族的最新进展,包括函数计算FC、Serverless应用引擎SAE和 Serverless事件总线EventBridg…

智能技术改变淘宝,阿里巴巴首次详解核心商业AI体系

简介: 双11背后的万亿人次商品需求:淘宝创造新一代智能科技,淘宝成为超大规模智能APP,前沿科技重塑双11人货场。 图:淘宝APP已成为超大规模智能APP “淘宝APP已成为超大规模智能APP。”阿里巴巴集团资深副总裁周靖人11…

wow mysql dbc_DBC中悲观锁介绍附案例详解

DBC中悲观锁介绍附案例详解了解下DBC中悲观锁:代码如下:BDUtils 工具类:package JDBC;import java.sql.*;public class BDUtils {private BDUtils() {}static {try {Class.forName("com.mysql.jdbc.Driver");} catch (ClassNotFoun…

融云任杰:强互动,RTC下一个“爆点”场景|拟合

从无序中寻找踪迹,从眼前事探索未来。 2021 年正值黄金十年新开端,CSDN 以中立技术社区专业、客观的角度,深度探讨中国前沿 IT 技术演进,推出年度重磅企划栏目——「拟合」,通过对话企业技术高管大咖,跟踪报…

直面最大挑战双11 阿里数据中台为商家带来确定性保障

2020双11将成为史上最具科技含量的一届双11。 11月3日,在阿里巴巴双11技术沟通会上,阿里巴巴集团首席技术官程立公布了大规模运用于2020双11的十大前沿技术,既有基于数字技术的原生商业创新,也有引领时代的基础技术突破。 阿里巴巴…

mysql rpm包安装指定路径_安装rpm包时指定路径

1、安装rpm包可以指定路径,但是安装包时它可能执行一些内置的命令。如果手动指定路径,可能造成部分功能失效比如下面安装jdk的rpm包。默认安装后它会创建个软链接。下面就提示创建软链接失败了。但是不影响使用[rootdawn-cobbler-1-1 /]# mkdir /tools[r…

玩转ECS第6讲 | 弹性计算Region化部署和跨可用区容灾介绍

弹性计算Region化部署和跨可用区容灾本身是非常复杂的课题,本次分享由阿里云弹性计算架构负责人李钟(谢顿)为大家介绍如何选择Region,同时结合阿里云在Region化部署和跨可用区容灾的实践经验,分享多region部署场景中如…

为产业数字化赋能!施耐德电气数字产业示范园落户北京

无人车在工厂里按部就班输送货物,机械臂快速装备各零件,庞大的车间内,智能生产线只有寥寥的工人……小时候畅想过的智能工厂,在北京亦庄新成立的施耐德电气数字产业示范园里实现了。 新成立的示范园包括施耐德电气(中…

在大规模 Kubernetes 集群上实现高 SLO 的方法

简介: 随着 Kubernetes 集群规模和复杂性的增加,集群越来越难以保证高效率、低延迟的交付 pod。本文将分享蚂蚁金服在设计 SLO 架构和实现高 SLO 的方法和经验。 作者 | 蚂蚁金服技术专家 姚菁华;蚂蚁金服高级开发工程师 范康 导读&#xf…

TI Inside,情报协同的最佳实践

6月18日,以“新IN力 御万象”为主题的 TI Inside 威胁情报应用生态协同峰会在北京隆重召开。此次峰会吸引了数百位网络安全产业专家、龙头企业代表、威胁情报生态合作机构、分析机构以及权威媒体齐聚一堂,共同交流威胁情报的最佳应用实践,探讨…

mysql分页查询所有数据库_MySQL 数据库 分页查询/聚合查询

引言在本篇博客简单介绍一下分页查询以及聚合查询简单操做。html分页查询在MySQL中,分页查询通常都是使用limit子句实现,limit子句声明以下:mysqlSELECT * FROM table LIMIT [offset,] rows | rows OFFSET offsetLIMIT子句能够被用于指定 SEL…

阿里云高级技术专家白常明:边缘云的技术挑战和应用创新

随着5G商用周期的开始与新基建的发展, 5G边缘计算带动并赋能数字化行业,逐渐形成了预期可观的产业规模。5G周期内,直接和间接带动产业规模就高达万亿级,在如此巨大的市场规模下,会有越来越多的行业具备数字化转型的技术…

饿了么技术往事(中)

在上一篇文章《饿了么技术往事(上)》中,我介绍了饿了么最早期 All in One 阶段的架构,以及第二阶段业务系统拆分与团队运营的一些思考,以及我对于架构师职责的感受,接下来我会详细介绍饿了么全面服务化的架…

高质量的缺陷分析:让自己少写 bug

简介: 缺陷分析做得好,bug 写得少。阿里资深技术专家和你分享如何进行高质量的缺陷分析,总结了 5 个要点,通过缺陷分析消除开发中的各种盲点,打造一个学习型的团队。 作者 | 嵩华 导读:缺陷分析做得好&am…

python 小海龟鼠标画图_Python小海龟画图

import turtle运动命令forward(d) 向前移动d长度backward(d) 向后移动d长度right(d) 向右移动d长度left(d) 向左一定d长度goto(x,y) 移动到坐标为(x,y)的位置speed(speed) 笔划绘制的速度1-10笔画控制命令up() 笔画抬起,在移动的时候不会绘图down() 笔画落下,下次绘图时则有效s…

IT、OT融合趋势下,西门子举办“第一届西门子工业边缘生态大会”

近日,西门子举办“第一届西门子工业边缘生态大会”,以“聚势边缘 共赋未来”为主题,来自全国机构专家、工业制造商、系统集成商、互联网伙伴、软件和大数据伙伴、媒体等生态伙伴深入交流未来工业的发展方向。 “边缘层融合IT和OT层&#xff0…

T级内存,创建效率提升10倍以上,阿里云 KVM异构虚拟机启动时间优化实践

简介: 阿里云工程师李伟男和郭成在 KVM Forum 2020 上详细介绍了阿里云 KVM 虚拟机创建及启动时间优化的具体技术实现,本文根据其演讲整理而成。 对于云计算用户来说,过长的 KVM 虚拟机创建及启动时间非常影响体验,特别是超大规格…

Android网络性能监控方案

背景 移动互联网时代,移动端极大部分业务都需要通过App和Server之间的数据交互来实现,所以大部分App提供的业务功能都需要使用网络请求。如果因为网络请求慢或者请求失败,导致用户无法顺畅的使用业务功能,会对用户体验造成极大影…

打破云原生时代存储瓶颈,SmartX 发布 K8s 云原生存储 IOMesh

编辑 | 宋 慧 供稿 | SmartX 头图 | 付费下载于视觉中国 专业超融合与分布式存储产品与解决方案提供商 SmartX 发布为 Kubernetes 设计和开发的云原生存储产品 IOMesh 预览版(以下简称“IOMesh”),加速数据库等有状态应用的容器化进程。 IO…