mysql的exists与inner join 和 not exists与 left join 性能差别惊人

由于客户数据量越来越大,在实践中让我发现mysql的exists与inner join 和 not exists与 left join 性能差别惊人。

我们一般在做数据插入时,想插入不重复的数据,或者盘点数据在一个表,另一个表否有存在相同的数据会用not exists和exists,例如:

insert into t1(a1) select b1 from t2 where not exists(select 1 from t1 where t1.id = t2.r_id);

 

如果t1的数据量很大时,性能会非常慢。经过实践,用以下方法能提高很多。

insert into t1(a1)
select b1 from t2
left join (select distinct t1.id from t1 ) t1 on t1.id = t2.r_id 
where t1.id is null;

 

 

select * from t1 where exists(select 1 from t2 where t1.id=t2.r_id);

 替换为:

select t1.* from t1 
inner join (select distinct r_id from t2) t2 on t1.id= t2.r_id 

 

这是实践的得出的结果。不知否有其他更好的方法,或则这个只是特例而已。 

 

Hive Left Semi Join 性能优化实战:替代 IN/EXISTS 子查询,提升大数据查询效率 在数据库和大数据查询中,JOIN操作是关联多表数据的核心。其原理是通过连接键将不同表的记录进行匹配,以实现数据的整合与筛选。从技术价值看,高效的JOIN能显著降低计算复杂度和I/O开销,是提升海量数据处理性能的关键。在应用场景上,存在性判断(如“查询A表中在B表中存在的记录”)是数据仓库、用户行为分析和ETL流程中的高频需求。传统上,开发者常使用IN或EXISTS子查询来实现,但在Hive等大数据环境下,这可能导致执行计划不佳、产生不必要的Shuffle和Reduce阶段,引发严重的性能瓶颈。此时,Left 阅读详情

相关推荐

SQL JOIN操作详解:从原理到实战优化

JOIN是关系型数据库中最核心的数据关联操作,通过连接条件将多个表的记录关联起来。其原理基于集合论,INNER JOIN实现集合交集,LEFT/RIGHT JOIN则保留单边全集。在电商系统、ERP等业务场景中,JOIN操作直接影响数据完整性和查询性能。实际开发中需要特别注意索引优化、NULL值处理和一对多关系去重等典型问题。通过合理使用LEFT JOIN保留主表数据、利用EXISTS替代部分JOIN场景,可以显著提升SQL执行效率。掌握JOIN的底层实现原理和优化技巧,是构建高效数据库查询的关键能力。

weixin_34067102的博客 306

IN、EXISTS和LEFT JOIN,NOT IN、NOT EXISTS和INNER JOIN在存在与不存在的查询效率

<br />/*<br /> IN、EXISTS和LEFT JOIN,NOT IN、NOT EXISTS和INNER JOIN在存在与不存在的查询效率<br /> */<br /> <br />IF OBJECT_ID('A') IS NOT NULL<br />   DROP TABLE A<br /> GO<br /><br /> CREATE TABLE A<br /> (<br /> ID INT<br /> )<br /> GO<br /><br /> IF OBJECT_ID

feegle的专栏 3894

MySQL查询语句体系构建:从基础语法到性能优化的实战指南

数据库查询是数据检索与分析的核心,其本质是通过结构化查询语言(SQL)与数据库管理系统进行交互,以获取、筛选和聚合所需数据。理解查询执行的底层原理,如索引机制、执行计划优化和数据连接算法,是提升查询效率的关键。掌握高效的查询技术不仅能显著提升应用性能、降低服务器负载,更能确保数据的一致性与准确性,在数据分析、报表生成、业务系统开发等场景中具有不可替代的价值。本文聚焦于构建一套完整的MySQL查询知识体系,深入剖析SELECT、JOIN、子查询等核心子句的实战应用与性能陷阱,并融入窗口函数、CTE等现代SQL

weixin_33770878的博客 772

SQL_(AND,OR,NOT)与或非,内部连接(INNER JOIN),左连接(LEFT JOIN ),右连接(RIGHT JOIN)完整外部连接(FULL OUTER J

AND和OR运算符用于根据多个条件筛选记录:AND语法: 选择Java1_student中,年龄大于21并且成绩高于60的人 OR语法 选择Java1_student中,年龄小于21,或者成绩低于60的人 NOT语法 INNER JOIN 语法 Java1_student表 Java1_studentGrade表 使用 INNER JOIN连接两个表并按照成绩从高到低返回学生信息 注意: 如果表中至少有一个匹配项,关键字将返回一行。如果 “Student” 表中的行与"studentGrade"

qq_43408367的博客 1482

Hive核心知识点和面试高频考点

Hive是一个开源的,建立在Hadoop上的数据仓库框架,提供类似SQL的HQL语言操作结构化数据,其基本原理是将HQL语言自动转换成Mapreduce任务或Tez任务或Spark任务,从而完成对Hadoop集群中存储的海量数据进行查询和分析。

qq_37771475的博客 550

Win11用户文件夹中文名修改全攻略

本文详细介绍了Windows 11系统中修改中文用户文件夹名称的完整步骤。操作包含七个关键环节:前期数据备份、账户名称修改、管理员账户激活、用户文件夹重命名、注册表路径更新、收尾操作及注意事项。特别强调需要同步修改账户名、文件夹名和注册表关联路径,并建议操作前备份重要数据。文中还针对常见问题提供了解决方案,如软件报错时的符号链接创建方法。整个过程需谨慎操作,建议在管理员权限下逐步执行,修改完成后需验证系统及软件功能是否正常。

Qinti_mm的博客 3123

exists查询慢_优化体系--mysql如何选择驱动表及驱动表查询优化总结

概述有的时候我们在操作数据库时会将两个或多个数据表关联起来通过一些条件筛选数据,在关联表时我们要遵循一些原则,这样会使我们编写的SQL 语句在效率上快很多。一、需要优化的查询使用explain常见的扫描类型有:system>const>eq_ref>ref>range>index>ALL 其扫描速度由快到慢;如果Extra出现了Using temporary;有...

weixin_39528366的博客 456

从零实战:基于华中8型数控系统的CNC数据采集与二次开发

本文详细介绍了基于华中8型数控系统的CNC数据采集与二次开发实战指南。从开发环境准备到核心数据采集实现,涵盖Windows平台配置、实时数据采集、报警处理等关键技术,帮助开发者快速掌握华中数控系统的数据采集能力,提升智能制造水平。

weixin_42561143的博客 813

SQL JOIN深度解析:INNER JOIN、LEFT JOIN与LEFT ANTI JOIN的核心区别与应用场景

在数据库查询与数据分析中,表连接(JOIN)是处理多表关联的核心技术。其原理基于关系代数,通过连接键将不同表中的记录进行匹配组合,实现数据的横向整合。掌握不同类型的JOIN操作对于保证数据查询的准确性与完整性具有重要技术价值,直接影响业务统计、用户行为分析和数据质量监控的结果。在实际应用场景中,INNER JOIN用于获取双方匹配的记录,如订单详情关联;LEFT JOIN常用于保留主表全集,如用户活跃度报表;而通过LEFT JOIN结合IS NULL条件实现的LEFT ANTI JOIN,则专用于查找存在于

weixin_30516243的博客 365

Unity 第一人称视角控制移动、旋转

第一人称视角操作此功能主要是借鉴YouTube,写的蛮好我就搬运过来让大家也试试。

qq_36515472的博客 4202

【WRF数据准备】土地利用数据-MODIS MCD12Q1数据下载及制备

【WRF数据准备】MODIS静态地理数据下载及制备

WW、forever的博客 3413

JOIN 不是拼上就完事,多表查询这几个坑先跑一遍

单表查询跑顺以后,多表查询很快就会出现。业务接口里很少只有一张表:用户要带订单,订单要带支付,统计时还要按用户、状态、时间分组。join这几个字本身不难,真正容易出问题的是结果行到底从哪张表开始保留,哪些字段会被补成 NULL,条件放在on里还是放在where里,以及统计时到底数的是用户、订单,还是连接后的结果行。从 MySQL 切到 KingbaseES,不需要一上来就追复杂场景。先用三张小表把结果边界跑清楚,比背一串 JOIN 类型更有用。

todoitbo的博客 2万+

使用LSTM实现自动调制识别(RML2018.01a)

目录一、LSTM的代码实现1.1 导入包1.2 数据读取及数据集划分1.3 数据预处理1.4 构建LSTM模型 本文基于RML2018.01a大型数据集,给出LSTM的信号识别的实现方式(附代码) RML2018.01a数据集信息如下: 模型 传送门 CNN/ResNet 使用CNN/ResNet实现自动调制识别(RML2018.01a) LSTM 使用LSTM实现自动调制识别(RML2018.01a)) 一、LSTM的代码实现 1.1 导入包 import numpy as np

QAQIknow的博客 6122

mysql in查询不要去重_MySQL 查询优化

使用索引规则全值匹配:查询的字段按照顺序在索引中都可以匹配到,最佳左前缀法则:指的过滤条件要使用索引必须按照索引建立时的顺序依次满足 , 一旦跳过某个字段 , 索引后面的字段都无法被使用。不在索引列上做计算:不在索引列上做任何操作(计算、函数、(自动 or 手动)类型转换「尤其注意 varchar 和 int」),会导致索引失效而转向全表扫描。索引列上不能有范围查询:将可能做范围查询的字段的索引顺...

weixin_42514777的博客 5361

从 30 天试用到企业级落地,2026 年学习和试用 SAP AI 的完整路线图

摘要:SAP AI产品体系存在试用版本与商业版本的边界模糊问题,需区分业务嵌入AI(如Joule)、开发者工具(SAP Build Code)和AI基础平台(Generative AI Hub)三个层级。建议学习路径:1)通过SAP Learning专区掌握理论框架;2)优先使用30天Generative AI Hub基础试用体验模型编排;3)结合90天BTP试用账户开发完整应用。特别注意免费计划已陆续停止,需以最新官方文档为准。开发者应重点关注AI如何与SAP技术栈(CAP、Fiori等)集成,而非单纯功

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 114

matlab 点云学习目录【2026最新版】

matlab 点云学习目录。博客长期更新,本文最近更新时间为:2026年6月15日。

点云侠的博客 3万+

数据库mysql八股

今天最大的收获不是背下了多少名词,而是承认了一件事:我基础是差了一截,直接上引擎对比、行锁表锁会懵,很正常。得先把外键、事务、JOIN、这三种“读问题”用人话钉住,再回头看小林那些八股,才接得上。反正刷题还得继续,概念也得一块补。先把今天这几个写明白,明天自己还能讲出来,就算没白学。—— 记于又一个把“好像懂了”变成“能讲清楚”的晚上。

lihaoweiwudi_的博客 562

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

SQL实战入门:从牛客网题库到数据库核心语法精解

SQL作为关系型数据库的核心查询语言,是数据操作与分析的基础工具。其工作原理是通过声明式语法描述数据需求,由数据库引擎解析并执行查询计划,最终返回结果集。掌握SQL不仅能高效进行数据检索、聚合与关联,更是理解数据库底层原理、进行性能优化的关键。在数据分析、后端开发、报表生成等应用场景中,SQL技能不可或缺。本文以牛客网SQL在线判题环境为切入点,系统梳理了从SELECT、WHERE基础筛选,到JOIN多表关联、GROUP BY分组聚合,再到子查询与函数处理的核心语法与常见陷阱。通过解析在线判题系统的匹配规则

weixin_30727835的博客 342

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

【MySQL索引】4索引优化

COUNT(*):最常用且效率最高的方法,大多数现代数据库系统对此做了专门的优化。COUNT(1):在性能上与 COUNT(*) 基本相同,大多数数据库系统会将它们处理得一样快。COUNT(具体字段):可能会更慢,特别是在字段上没有索引时。它只计算非 NULL 的字段值,因此可能需要扫描整个表来完成计数。

ChanceZhou的博客 1895

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Mysql调优总结(持续更新中)

查询SQL尽量不要使用select,而是select具体字段。反例子:select * from employee;正例子:select id,name from employee;反例:select id,name from employee where name=‘jay’正例:select id,name from employee where name=‘jay’ limit 1;反例:正例://方案一 :返回上次查询的最大记录(偏移量)

qq_42265640的博客 419

《高性能MySQL》第六章查询性能优化(2)MySQL查询优化器的局限性

MySQL查询优化器的局限性 关联子查询 5.5及之前,MySQL中子查询实现得非常糟糕。最糟糕的一类是WHERE条件中包含IN的子查询。 它的执行过程并不是如预想的那样是先执行IN中子查询,再根据IN的优化来寻找,而是将外查询压到子查询中。可以使用 JOIN语句来重写子查询 不过本机是5.7,好像没有这么问题了? EXPLAIN SELECT SQL_NO_CACHE * FROM sakila.film WHERE film_id IN(SELECT film_id FROM sakila.film_a

qq_38732834的博客 211

SQL语句整理二--Mysql

这个是要区分环境的。就遇到了本来想根据三个字段去插入数据,结果 unique 索引只设置了两个字段,这就导致本来想插入两个字段值一样另一个字段值不一样的五条数据,但不一样的那个字段没设置为 unique 索引,这就导致只插入了一条循环后的最后一条数据。开窗函数与聚合函数一样,也是对行集组进行聚合计算,但是它不像普通聚合函数那样每组只返回一个值,开窗函数可以为每组返回多个值,因为开窗函数所执行聚合计算的行集组是窗口。会覆盖不指定字段的值,比如我更新字段1和2之前字段3的值为5,字段3设置的默认值为0,则。

小强签名设计 的博客 1581
上一篇: [Javascript技巧]代码编辑器的行号,通过hash定位
下一篇: The last packet successfully received from the server was 596,688 milliseconds a
staffrobot
博客等级 码龄19年 6粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值