网站首页 > 文章精选 正文
当 SQL 卡住时,你是不是这样?
“为啥查询跑了 10 分钟还没结果?”
“NOT IN 子查询又把数据库搞崩溃了!”
别慌!今天教你用LEFT JOIN+IS NULL组合拳,让查询效率原地起飞~
实战场景:找 “失踪人口”
假设你有两个表:
tableA(目标表)
Key | Value |
A1 | 100 |
A2 | 200 |
A3 | 300 |
tableB(对比表)
Key | Value |
A2 | 250 |
A4 | 400 |
需求:查出 tableA 中在 tableB 里不存在的记录
传统写法:NOT IN 和 NOT EXISTS 有多拉垮?
-- NOT IN:子查询像“复读机”,每条数据都要查一遍
SELECT * FROM tableA A WHERE A.Key NOT IN (SELECT B.Key FROM tableB B);
-- NOT EXISTS:更像“碎碎念”,逐条对比累到吐血
SELECT * FROM tableA A WHERE NOT EXISTS (SELECT 1 FROM tableB B WHERE B.Key = A.Key);
问题本质: 数据量大时,子查询会被反复执行,数据库直接 “累瘫”,查询速度比蜗牛爬还慢!
高效解法:LEFT JOIN 秒变 “效率王者”
-- LEFT JOIN+IS NULL:一步到位的神仙操作
SELECT A.* FROM tableA A
LEFT JOIN tableB B ON A.Key = B.Key
WHERE B.Key IS NULL;
白话解析:
- LEFT JOIN像 “牵红线的红娘”,把 tableA 和 tableB 按 Key 字段 “相亲”;
- 没 “配对成功” 的记录(即 tableB 中不存在的 Key),会在 B.Key 字段留下NULL;
- 用WHERE B.Key IS NULL筛选出这些 “单身狗” 记录,就是 tableA 独有的数据!
为什么 LEFT JOIN 快到飞起?
对比项 | NOT IN/NOT EXISTS | LEFT JOIN+IS NULL |
执行逻辑 | 子查询反复查,相当于 “盲搜” | 一次 JOIN 完成关联,相当于 “精准定位” |
索引利用 | 难走索引,效率低下 | 可充分利用索引,速度飙升 |
大数据表现 | 数据越多越卡,甚至崩溃 | 数据量越大,优势越明显 |
类比场景:
找一本绝版书时:
- NOT IN 像在图书馆里闭着眼睛乱摸,全靠运气;
- LEFT JOIN 像提前知道书在 “3 楼 C 区 5 排”,直接冲过去拿!
终极口诀:下次直接套公式
当需要 “查 A 表不在 B 表的数据” 时,直接复制以下代码:
SELECT A.* FROM 表A A
LEFT JOIN 表B B ON A.关联字段 = B.关联字段
WHERE B.关联字段 IS NULL;
同事看到后的反应:
“你这 SQL 写得也太秀了吧!查询怎么突然快了 10 倍?”
额外福利:性能测试小技巧
想验证效果?试试用EXPLAIN关键字:
EXPLAIN SELECT * FROM tableA A WHERE A.Key NOT IN (...);
EXPLAIN SELECT A.* FROM tableA A LEFT JOIN tableB B ON...;
对比执行计划,你会看到 LEFT JOIN 的 “成本值” 低到感人!
最后提醒: 记得把这篇文章收藏 + 转发,下次写 SQL 再也不怕被 DBA 怼 “查询太慢” 啦~
猜你喜欢
- 2025-07-10 失业程序员复习python笔记——mysql
- 2025-07-10 MySQL高性能注意事项简述(高性能mysql重点章节)
- 2025-07-10 MySQL触发器介绍(mysql触发器使用)
- 2025-07-10 2021年超详细的java学习路线总结—纯干货分享
- 2025-07-10 MySQL常见错误及解决方法(mysql常见错误提示及解决方法)
- 2025-07-10 MySQL索引失效场景分析与优化(mysql索引何时失效)
- 2025-07-10 MySQL实战:聊聊子查询 vs 联表查询应该如何选择?
- 2025-07-10 The entangled power of BRICS(the power of dreams)
- 2025-07-10 谁再在 SQL 中写 in 和 not in,直接走人!
- 2025-07-10 SQL面试题及答案( Top20)(mysql面试题及答案)
- 最近发表
-
- Vue3+Django4全新技术实战全栈项目|高清完结
- 工厂模式+策略模式消除 if else 实战
- 每天一个 Python 库:httpx异步请求,让接口测试飞起来
- 如何高效实现API接口的自动化测试?
- 前端工程化:从“手忙脚乱”到“从容协作”的进化记
- 使用C#创建服务端Web API(c#开发web服务器)
- SpringBoot之旅第四篇-web开发(springboot做web项目)
- 一文读懂SpringMVC(一文读懂新型政策性金融工具)
- Rust Web编程:第十二章 在 Rocket 中重新创建我们的应用程序
- Apache Druid 数据摄取——本地数据和kafka流式数据 一篇文章看懂
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)
- mysql数据库面试题 (57)