“不受待见”的 in 和 not in

MySQL使用Not in查询效率慢的优化 问题复盘,在查询某个数据不在另一个表中,查询时间非常慢,10几秒。究其原因not in不走索引。那么怎么解决优化呢,下面是简单记录。 阅读详情

 # WHY?

IN 和 NOT IN 是比较常用的关键字,为什么要尽量避免呢?

1、效率低 

项目中遇到这么个情况:

t1表 和 t2表  都是150w条数据,600M的样子,都不算大。

但是这样一句查询 ↓

select * from t1 where phone not in (select phone from t2)

直接就把我跑傻了。。。十几分钟,检查了一下  phone在两个表都建了索引,字段类型也是一样的。原来not in 是不能命中索引的。。。。

改成 NOT EXISTS 之后查询 20s ,效率真的差好多。

select * from t1
where  not  EXISTS (select phone from t2 where t1.phone =t2.phone)

2、容易出现问题,或查询结果有误 (不能更严重的缺点)

以 IN 为例。建两个表:test1 和 test2

create table test1 (id1 int)
create table test2 (id2 int)
insert into test1 (id1) values (1),(2),(3)
insert into test2 (id2) values (1),(2)

我想要查询,在test2中存在的  test1中的id 。使用IN的一般写法是:

select id1 from test1
where id1 in (select id2 from test2)

结果是: 

图片

OK 木有问题!

但是如果我一时手滑,写成了:

select id1 from test1where id1 in (select id1 from test2)

不小心把id2写成id1了 ,会怎么样呢?

结果是:

图片

EXCUSE ME!为什么不报错? 

单独查询 select id1 from test2 是一定会报错: 消息 207,级别 16,状态 1,第 11 行 列名 'id1' 无效。

然而使用了IN的子查询就是这么敷衍,直接查出 1 2 3

这仅仅是容易出错的情况,自己不写错还没啥事儿,下面来看一下 NOT IN 直接查出错误结果的情况:

给test2插入一个空值:

insert into test2 (id2) values (NULL)

我想要查询,在test2中不存在的  test1中的id 。

select id1 from test1
where id1 not in (select id2 from test2)

结果是:

图片

空白!显然这个结果不是我们想要的。我们想要3。为什么会这样呢?

原因是:NULL不等于任何非空的值啊!如果id2只有1和2, 那么3<>1 且 3<>2 所以3输出了,但是 id2包含空值,那么 3也不等于NULL 所以它不会输出。

(跑题一句:建表的时候最好不要允许含空值,否则问题多多。)

# HOW?

1、用 EXISTS 或 NOT EXISTS 代替

select * from test1
   where EXISTS (select * from test2 where id2 = id1 )
select * FROM test1
 where NOT EXISTS (select * from test2 where id2 = id1 )

​​​​2、用JOIN 代替

select id1 from test1
   INNER JOIN test2 ON id2 = id1
select id1 from test1
   LEFT JOIN test2 ON id2 = id1
   where id2 IS NULL

妥妥的没有问题了!

PS:那我们死活都不能用 IN 和 NOT IN 了么?并没有,一位大神曾经说过,如果是确定且有限的集合时,可以使用。如 IN (0,1,2)。

游戏下载站CMS实战:采集+AI伪原创+SEO自动化全流程 在垂直内容站建设过程中,CMS系统不仅是内容管理工具,更是整个自动化流程的调度中枢。通过合理的采集规则设计,可以从源头获取结构化数据;再借助AI伪原创技术生成差异化内容,有效解决重复度高的问题;同时结合SEO优化与主动推送,能够加速搜索引擎收录、提升站点权重。这套模式尤其适合游戏下载站这类内容密集、更新频繁的垂直场景。本文以“游嘻CMS”为例,梳理从采集引擎、AI改写、自动发布到SEO收录落地的完整链路,并分享实际踩坑经验,为个人与中小站长提供一套可复制的技术方案。 阅读详情

相关推荐

Fluent DPM模型保姆级教程:三通管颗粒流动模拟,从网格导入到轨迹图生成

本文提供Fluent DPM模型在三通管颗粒流动模拟中的保姆级教程,涵盖从网格导入到轨迹图生成的全流程。通过详细步骤和参数设置,帮助用户掌握DPM模型在颗粒流动模拟中的关键技巧,适用于化工、能源等领域的工程应用。

weixin_30615767的博客 582

MySQL not in查询不出数据(MySQL not in 无效)

MySQL not in查询不出数据(MySQL not in 无效)

gaoshan12345678910的博客 1万+

mcgs数据查表功能,用于大量数据对比查找对应数据,减少PLC代码

mcgs脚本实现数据查表功能

qq_24866535的博客 3271

Mysql基础教程(06):NOT IN

NOT IN 是 IN 的否定操作符,本文通过实例介绍了 MySQL 中如何使用 NOT IN 判断一个值是否不包含在一个值列表中。

WwLK123的博客 2936

开关电源环路学习笔记(1)-为啥要知道传递函数?

做硬件都会接触到开关电源,或多或少会接触到环路补偿。很多兄弟们也提出来让我说说这个,说明大家也都很关心,也说明这个好像有点难。 就我个人而言,我也想搞明白环路这一块,也查了一些资料,视频,不过说实话,一直都还是懵的,感觉很困难。 具体感觉就是,看资料或视频的时候,感觉好像是那么回事。但是撇开之后,就又云里雾里的感觉,总有一些想法没有找到答案。 问题 比如下面我想过的问题: 开关电源有开关,根本就不是一个线性系统,传递函数是咋弄出来的? 系统环路框图的输入量为什么不是Vin,而是参考电压V

weixin_42005993的博客 1万+

Cisco 路由器 打环测试教程

环 回测试是很常用的一种测试,通常用于检查和分析端口或线路问题。如下图所示,我们在设备端口上用命令loopback(某些端口上命令格式为 loopback diagnostic)使接口从内部将自己发送的信号转接到自己的接收端(如红线所示),通过检查数据发送和接收的情况来判断端口工作状态是否正常。如果 需要对端口进行完全的检测,可以使用符合标准的短跳线将端口收发短接构成环...

weixin_34304013的博客 2024

MySql中NOT IN使用时的注意事项

在MySql中,NOT IN是用来查询不在某个值集的数据。 NOT IN的使用需要注意NULL值判断,如果数据库查询出来的字段值为NULL时,NOT IN是走不通的,如: SELECT name, age FROM USER WHERE age NOT IN(12,13) 上面这个sql语句用于查询user表中age不等于12或13的所有用户,如果有一个用户没有添加age信息,此时数据库中该字段为NULL,那么这条数据是查不出来的,如果想要查出age为NULL的数据,可以判空来解决: SELECT nam

jl15988 1万+

TypeScript版LangChain环境配置全攻略:从零搭建AI应用开发环境

大语言模型(LLM)作为当前AI应用开发的核心技术,通过API接口为开发者提供了强大的自然语言处理能力。其工作原理基于Transformer架构,通过预训练和微调实现对人类语言的深度理解与生成。在工程实践中,开发者需要将LLM与外部工具、数据源和业务逻辑有效集成,这正是LangChain框架的技术价值所在——它提供了标准化的组件和接口,简化了复杂AI应用的构建流程。应用场景涵盖智能客服、内容生成、数据分析助手等多个领域。本文聚焦于TypeScript/JavaScript生态下的LangChain开发,详细

weixin_29055699的博客 253

MySQL(42)MySQL IN和NOT IN用法详解

MySQL 中的 IN 运算符用来判断表达式的值是否位于给出的列表中;如果是,返回值为 1,否则返回值为 0。NOT IN 的作用和 IN 恰好相反,NOT IN 用来判断表达式的值是否不存在于给出的列表中;如果不是,返回值为 1,否则返回值为 0。expr 表示要判断的表达式,value1, value2, value3 ... valueN 表示列表中的值。MySQL 会将 expr 的值和列表中的值逐一对比。由结果可以看到,IN 和 NOT IN 的返回值正好相反。

逍遥人世欢 3054

Python读取三菱PLC数据

3、支持自定义的数据读写操作。直接调用Read方法,可以读取到原生的byte数组,然后进行组合数据。1、每次的数据交互您都可以判断是否成功,如果您不判断,如果网络断开或是异常,会影响程序的执行。Qna3E协议的ascii类 MelsecMcAsciiNet。A兼容1E协议的二进制类 MelsecA1ENet。Qna3E协议的二进制类 MelsecMcNet。2、读写操作支持单个数和数组。

weixin_46744807的博客 2000

AVL-Excite新手必看:5步搞定发动机阀系系统建模(附B站视频教程)

本文为AVL-Excite新手提供发动机阀系系统建模的5步详细指南,涵盖软件环境搭建、基本结构建立、关键参数设置、仿真分析及常见问题排查。通过清晰的步骤说明和实用技巧,帮助工程师快速掌握建模方法,并附有精选B站视频教程链接,便于实践学习。

weixin_29305313的博客 511

“不受待见”的 in 和 not in【送源码】

IN 和 NOT IN 是比较常用的关键字,为什么要尽量避免呢?项目中遇到这么个情况:t1表 和 t2表 都是150w条数据,600M的样子,都不算大。但是这样一句查询 ↓直接就把我跑傻了。。。十几分钟,检查了一下 phone在两个表都建了索引,字段类型也是一样的。原来not in 是不能命中索引的。。。。改成 NOT EXISTS 之后查询 20s ,效率真的差好多。以 IN 为例。建两个表:test1 和 test2我想要查询,在test2中存在的 test1中的id。

java_121388的博客 401

YOLO26剪枝 lamp剪枝测试精度仅掉0.7个点,速度提高11.8fps!

针对没有如何去选择剪枝的内容LAMP是层自适应幅度调整剪枝,无需任何参数,通过算法内部自己计算每个层的重要程度进行剪枝。基于权重重要程度和该层权重大小关系,权重越大表明该层越重要的思想进行优化。这个跟我前面说的非结构化全局剪枝是一个解法(MP),也就是lamp是在我前面那个非结构化剪枝的基础上进行优化的。但是这个逐层进行非结构剪枝目前还没有一个清晰的概念,确定每个层要剪枝多少。LAMP得分是一个平方权重大小,由层中所有“幸存权重”的总和归一化。

m0_64661770的博客 675

性价比陷阱?视觉导航如何破解“降本即降效”难题

即便视觉方案在智驾领域里风头正劲,但在机器人领域仍不受待见。

weixin_43922139的博客 653

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

被DeepSeek带火的知识蒸馏,开山之作曾被NeurIPS拒收,Hinton坐镇都没用

小明 发自 凹非寺量子位 | 公众号 QbitAIDeepSeek带火知识蒸馏,原作者现身爆料:原来一开始就不受待见。称得上是“蒸馏圣经”、由Hinton、Oriol Vinyals、Jeff Dean三位大佬合写的《Distilling the Knowledge in a Neural Network》,当年被NeurIPS 2014拒收。如何评价这篇论文的含金量?它提出了知识蒸馏这一概念,能...

量子位 204

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

xml python findall_关于Python xml.etree.ElementTree的find(),findall()中参数格式的讲解(未完待续)...

这两天学习如何使用微软的一个API,用python写了接口代码使用HTTP方法测试,HTTP的API的最后返回是一个XML文件,翻了翻,看见python的xml的ElementTree这套接口的API看起来比较对胃口,于是使用了一下ElementTree进行解析但死活用find,和findall两个函数接口服务得到希望的tag,百思不得其借,Python的docamention上面对这两个函数,解...

weixin_32462499的博客 1633

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

从璩静离开百度,谈谈短视频时代图文媒体的话语权

实际上,图文自媒体的声音不都是负面的,图文自媒体提供的理性中,更多是观点输出,也有好的地方,比如包括互联网江湖在内的不少人都是这么一种认知:虽然璩静All IN短视频翻车了,但也是一种积极的尝试。从传播的角度看,从短视频到图文,信息的重心在变,短视频引爆了大众情绪,图文媒体带来了专业的解读,信息传播也从公域渗透到私域,并最终影响到了企业管理层的决策。璩静这个事儿,一开始虽然有热度,但不够炸裂,直到图文自媒体下场,一个又一个内部消息流出,节奏感爆棚,最终打破了圈层壁垒,最后李厂长不得不内部发言平事儿。

2401_84038765的博客 802

【C#】让ReSharper灰色显示未使用的非私有成员的关键

【C#】让ReSharper灰色显示未使用的非私有成员的关键 原文:【C#】让ReSharper灰色显示未使用的非私有成员的关键环境:VS2010+ReSharper8 先说答案: 1、在Inspection Severity中设置Non-private accessibility为Warning。如图: 该页面在ReSharper菜...

weixin_30477293的博客 132

Python Selenium API变更:解决executable_path报错与版本兼容性

在Python开发中,API(应用程序编程接口)定义了不同软件组件之间的交互规范。当库的版本升级时,开发者可能会修改API以实现功能优化或代码重构,这有时会导致向后不兼容的变更。理解API变更的原理对于维护代码的长期稳定性和可维护性至关重要,尤其是在自动化测试和Web爬虫等工程实践领域。例如,Selenium作为广泛使用的浏览器自动化工具,在其4.0版本中引入了更清晰的Service对象来管理浏览器驱动,取代了之前直接在WebDriver构造函数中传递executable_path参数的方式。这种设计遵循了

weixin_34166472的博客 365

牵引逆变器DC-Link电容选型与设计:CeraLink陶瓷电容如何简化高压系统

DC-Link电容是牵引逆变器直流母线上的核心储能与滤波元件,直接影响母线电压稳定、功率模块关断过冲和EMC性能。传统铝电解电容ESR/ESL高、寿命短,薄膜电容虽改善性能但体积大、并联结构复杂。随着SiC MOSFET普及,开关瞬态变快,低杂散电感和高频纹波抑制成为设计关键。TDK CeraLink基于PLZT压电陶瓷,具有低ESL/ESR、高纹波电流能力和偏压越高容值越大的特性,可有效吸收高频开关尖峰,简化母排布局,减少并联冗余,并适配800V高压平台。本文结合工程实践,介绍其工作原理、有效容值选型、热

weixin_34345753的博客 384

Amazon Alexa接入IoT设备:Smart Home Skill、ACK与Custom Skill方案对比与实操

智能家居的语音控制已成为物联网(IoT)领域的标配能力,Amazon Alexa作为全球应用最广的语音助手之一,为自研设备提供了标准化的接入通道。在设备接入过程中,开发者需要理解Alexa的对话管道、设备云通信协议以及技能后端逻辑。Smart Home Skill API是面向量产智能家居设备的首选方案,它通过Lambda承载设备发现与指令路由,支持PowerController、TemperatureSensor等标准接口;Alexa Connect Kit(ACK)则适合不想维护云端的硬件厂商,内置协议

weixin_33882452的博客 450

【mysql】in和exists的区别,not in、not exists、left join的相互转换

在oracle中,int中数据集的大小超过1000会报错;在mysql中,超过1000不会报错,但也是有数据量限制的,应该是4mb,但不建议数据集超过1000,因为in是可以走索引的,但in中数据量过大索引就会失效exist + not exists 是全量数据,这点与in不同。

weixin_44823875的博客 3318

MySQL not in 不走索引?胡扯

今天的文章是之前筹划的《程序员十万个为什么》[1] 系列文章。经常有面试题问到 MySQL not in 走索引吗?偶尔也会有同事说,千万别用 not in, 不走索引性能贼差,not in 性能好不好和对应的字段的区分度有关,那么这是真的吗?今天小匠就带大家深入了解一下这个问题,首先我们需要使用 explain 关键字,所以需要了解一下这个关键字。explain 即为执...

码匠笔记 5476

MySQL中in、exists、not in、not exists使用

这里写自定义目录标题1 in与exists原理解析(1) in的原理(2)exists原理2 in与exists适用场景3 not in 和not exists 1 in与exists原理解析 作为一个后端程序猿,有必要对经常使用到的in与exists原理进行了解。 假设:A表中的id与B表中的uid关联 (1) in的原理 in语句: select * from A where id in(se...

u012803336的博客 1573

Mysql中in和exists的区别 & not in、not exists、left join的相互转换

Mysql中in和exists的区别 & not in、not exists、left join的相互转换

心流时间的博客 4951
上一篇: 3.6k Star ,上架即封神!
下一篇: 大量简化代码!Java Stream 简单技巧!
架构文摘JGWZ
博客等级 码龄5年 8808粉丝 345原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值