针对 SQL 查询中 IN 子句性能优化 以及 等值 JOIN 和不等值 JOIN 对比 的详细解决方案、代码示例及表格总结
以下是针对 SQL 查询中 IN 子句性能优化 以及 等值 JOIN 和不等值 JOIN 对比 的详细解决方案、代码示例及表格总结:
问题 1:IN 的候选值过多(如超过 1000 个)
问题描述
当 IN 列表中的值过多时,SQL 会逐个比较每个值,导致性能下降(尤其是全表扫描时)。
解决方案
将 IN 列表转换为 临时表或 CTE,并通过 JOIN 或 EXISTS 优化查询。
代码示例
-- 创建临时表存储候选值
CREATE TEMPORARY TABLE temp_values (id INT);
INSERT INTO temp_values (id) VALUES (1), (2), ..., (1000);-- 原始低效写法(IN 列表过长)
SELECT * FROM orders WHERE order_id IN (1, 2, ..., 1000);-- 优化后:使用 JOIN
SELECT o.*
FROM orders o
JOIN temp_values tv ON o.order_id = tv.id;-- 或使用 EXISTS
SELECT o.*
FROM orders o
WHERE EXISTS (SELECT 1 FROM temp_values tv WHERE o.order_id = tv.id
);
性能提升原因
- 减少 IN 列表的内存消耗:临时表或 CTE 将数据存储在内存中,避免单条 SQL 的参数列表过长。
- 利用索引加速关联:通过
JOIN或EXISTS,数据库可以利用临时表的索引优化查询。
问题 2:IN 的候选值是表中的列
问题描述
直接使用 IN 子查询(如 WHERE col IN (SELECT col FROM table))可能导致性能问题,尤其是当子查询结果集较大时。
解决方案
将 IN 替换为 EXISTS 或 JOIN,并确保关联列上有索引。
代码示例
-- 原始低效写法
SELECT *
FROM orders o
WHERE o.customer_id IN (SELECT customer_id FROM customers);-- 优化后:使用 EXISTS
SELECT o.*
FROM orders o
WHERE EXISTS (SELECT 1 FROM customers c WHERE o.customer_id = c.customer_id
);-- 或使用 JOIN
SELECT o.*
FROM orders o
JOIN customers c ON o.customer_id = c.customer_id;
性能提升原因
- EXISTS 的短路机制:
EXISTS在找到第一个匹配时立即返回,避免遍历所有结果。 - JOIN 的索引利用:通过
JOIN可以更高效地利用关联列的索引,减少全表扫描。
问题 3:等值 JOIN 和不等值 JOIN 对比
等值 JOIN(=)
用于关联两个表的相同值,性能通常较好,因为可以利用索引。
不等值 JOIN(如 <, >)
用于关联不同值的范围,可能导致性能问题,因无法有效利用索引。
代码示例
-- 等值 JOIN(高效)
SELECT o.order_id, c.customer_name
FROM orders o
JOIN customers c ON o.customer_id = c.customer_id; -- 等值关联-- 不等值 JOIN(低效)
SELECT o.order_id, c.customer_name
FROM orders o
JOIN customers c ON o.order_date > c.registration_date; -- 不等值关联-- 优化不等值 JOIN 的示例(假设业务场景允许)
-- 使用子查询或条件过滤缩小范围
SELECT o.order_id, c.customer_name
FROM orders o
JOIN customers c ON o.customer_id = c.customer_id -- 等值关联
WHERE o.order_date > c.registration_date;
性能对比
| 类型 | 写法 | 性能 | 原因 |
|---|---|---|---|
| 等值 JOIN | ON a = b | 高效 | 可利用索引,执行计划为直接关联。 |
| 不等值 JOIN | ON a > b | 低效 | 无法有效利用索引,可能导致全表扫描或笛卡尔积。 |
总结表格
| 问题类型 | 解决方案 | 示例代码片段 | 性能提升原因 |
|---|---|---|---|
| IN 候选值过多 | 临时表 + JOIN/EXISTS | JOIN temp_values ON ... 或 EXISTS (SELECT 1 FROM temp_values ...) | 减少参数列表长度,利用索引加速关联。 |
| IN 候选值是表的列 | 替换为 EXISTS 或 JOIN | EXISTS (SELECT 1 FROM customers ...) 或 JOIN customers ON ... | EXISTS 短路优化;JOIN 利用索引,减少全表扫描。 |
| 等值 JOIN | 直接使用 ON a = b | JOIN ... ON orders.customer_id = customers.customer_id | 可利用索引,执行计划高效。 |
| 不等值 JOIN | 优化条件或缩小范围 | WHERE o.order_date > c.registration_date(结合等值 JOIN) | 避免直接使用不等值 JOIN,改用条件过滤缩小数据范围。 |
关键注意事项
- 索引优化:确保关联列(如
customer_id,order_id)在两个表中均有索引。 - 临时表清理:使用完临时表后及时删除(
DROP TEMPORARY TABLE temp_values)。 - 查询分析:通过
EXPLAIN分析执行计划,确认索引是否被正确使用。
通过上述方法,可显著提升 IN 子句和 JOIN 的查询性能。
相关文章:
针对 SQL 查询中 IN 子句性能优化 以及 等值 JOIN 和不等值 JOIN 对比 的详细解决方案、代码示例及表格总结
以下是针对 SQL 查询中 IN 子句性能优化 以及 等值 JOIN 和不等值 JOIN 对比 的详细解决方案、代码示例及表格总结: 问题 1:IN 的候选值过多(如超过 1000 个) 问题描述 当 IN 列表中的值过多时,SQL 会逐个比较每个值…...
微信小程序唤起app
1、前提 1、app与小程序主体需一致,可以前往微信公众平台关联。 2、小程序的场景值为1069,也就是得从app打开小程序,小程序才能唤起app。 2、vue3代码示例 <template><view class"maxBox bgc"><button open-typ…...
深度学习Note.5(机器学习.6)
1.Runner类 一个任务应用机器学习方法流程: 数据集构建 模型构建 损失函数定义 优化器 模型训练 模型评价 模型预测 所以根据以上,我们把机器学习模型基本要素封装成一个Runner类(加上模型保存、模型加载等功能。) Runne…...
从零开始设计Transformer模型(1/2)——剥离RNN,保留Attention
声明: 本文基于哔站博主【Shusenwang】的视频课程【RNN模型及NLP应用】,结合自身的理解所作,旨在帮助大家了解学习NLP自然语言处理基础知识。配合着视频课程学习效果更佳。 材料来源:【Shusenwang】的视频课程【RNN模型及NLP应用…...
Uniapp 持续出现 Invalid Host/Origin header 解决方法
目录 前言1. 问题所示2. 原理分析前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 爬虫神器,无代码爬取,就来:bright.cn 1. 问题所示 执行代码的时候,源源不断,一直持续出现这个 Invalid Host/Origin header [WDS]...
【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring Boot 中的缓存技术:使用 Redis 提升性能
<前文回顾> 点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&sharefromfrom_link <今日更新> 一、开篇整…...
音视频 YUV格式详解
前言 本文介绍YUV色彩模型,YUV的分类和常见格式。 RGB色彩模型 在RGB颜色空间中,任意色光F都可以使用R、G、B三色不同的分量混合相加而成即: F = R + G + B.。即我们熟悉的三原色模型。 RGB色彩空间根据每个分量在计算机中占用的存储字节数可以分为以下几种类型,字节数…...
华为配置篇-BGP实验
BGP 一、简述二、常用命令总结三、实验 一、简述 IBGP 水平分割:从一个 IBGP 对等体学到的路由,不会再通告给其他的 IBGP 对等体。在一个 AS 内部,路由器之间通过 IBGP 交换路由信息。如果没有水平分割机制,当多个路由器之间形成…...
一个服务器算分布式吗,分布式需要几个服务器
一个服务器不构成分布式系统。分布式系统的核心在于多台独立的计算机(服务器)协同工作,通过通信网络共享资源、共同完成任务。以下是对问题的详细分析: 1. 单台服务器 ≠ 分布式 单台服务器的架构是集中式的,所有功能…...
vue element-ui 工程创建
vue element-ui 工程创建 按照步骤 : https://blog.csdn.net/wowocpp/article/details/146590400 创建工程 vue create demo3 cd demo3 npm run serve 在demo3 目录里面 执行如下命令 npm install element-ui -S 然后查看 package.json main.js 添加代码&…...
unity点击button后不松开通过拖拽显示模型松开后模型实例化
using System.Collections; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI;[RequireComponent(typeof(Button))] // 确保脚本挂在Button上 public class DragButtonSpawner : MonoBehaviour, IPointerDownHandler, IDragHandler, IPointerUpHandle…...
arco design框架中的树形表格使用中的缓存问题
目录 1.问题 2.解决方案 1.问题 arco design框架中的树形表格使用中的缓存问题,使用了树形表格的load-more懒加载 点击展开按钮后,点击关闭,再次点击展开按钮时,没有调用查询接口,而是使用了缓存的数据。 2.解决方…...
《AI大模型应知应会100篇》第2篇:大模型核心术语解析:参数、Token、推理与训练
第2篇:大模型核心术语解析:参数、Token、推理与训练 摘要 本文将用通俗易懂的语言拆解大模型领域的四大核心概念:参数、Token、训练与推理。通过案例对比、代码实战和成本计算,帮助读者快速掌握这些术语的底层逻辑与实际应用价值…...
【28BYJ-48】STM32同时驱动4个步进电机,支持调速与正反转
资料下载:待更新。。。。 先驱动起来再说,干中学!!! 1、实现功能 STM32同时驱动4个步进电机,支持单独调速与正反转控制 需要资源:16个任意IO口1ms定时器中断 目录 资料下载:待更…...
手动实现一个迷你Llama:使用SentencePiece实现自己的tokenizer
自己训练一个tokenizertokenizer需要的模块SentencePiece 库tokenizer类中的初始化函数tokenizer类中的encode函数tokenizer类中的decode函数完整代码训练函数数据分片临时文件SentencePiece 训练参数 自己训练一个tokenizer tokenizer需要的模块 encode: 将句子转换为tokend…...
【超详细】讲解Ubuntu上如何配置分区方案
Ubuntu 的分区方案 一、通用分区方案(200G为例) EFI系统分区(仅UEFI启动模式需要,) 大小:512MB–1GB类型:主分区(FAT32格式)挂载点:/boot/efi说明࿱…...
Gradle-基础
一.安装 1. 2.配置环境变量 GRADLE_HOME D:\gradle\gradle-5.6.4 GRADLE_USER_HOME D:\gradle\localRepository 3.下载源配置 安装目录下的init.d文件夹里创建一个init.gradle文件,下载顺序从上到下,内容࿱…...
Anolis系统下安装Jenkins
1.安装java、maven yum install -y java-17-openjdk-devel maven git wget 2.配置环境变量 1.查看java和maven所在目录 [rootlocalhost ~]# which java /usr/bin/java [rootlocalhost bin]# ll /usr/bin/java lrwxrwxrwx 1 root root 22 4月 1 17:20 /usr/bin/java ->…...
Python网络爬虫:从入门到实践
目录 什么是网络爬虫? 网络爬虫的工作原理 常用Python爬虫库 编写爬虫的步骤 实战示例 注意事项与道德规范 未来趋势 1. 什么是网络爬虫? 网络爬虫(Web Crawler)是一种自动化程序,通过模拟人类浏览行为&#x…...
LabVIEW 调用 Python 函数
此程序是 LabVIEW 调用 Python 函数实现双精度数相加的典型示例。通过 LabVIEW 搭建交互框架,借助 “Open Python Session” 创建 Python 代码运行环境,定位 Python 模块路径后调用 “Add” 函数,最终实现数据处理并关闭会话。整个流程展现了…...
视频分析设备平台EasyCVR视频结构化AI智能分析:筑牢校园阳光考场远程监控网
一、背景分析 近年来,学校考试的舞弊现象屡禁不止,严重破坏考试的公平性,不仅损害广大考生的切身利益,也在社会上造成恶劣的影响。为有效制止舞弊行为,收集确凿的舞弊证据,在考场部署一套可靠的视频监控…...
AWS用Glue读取S3文件上传数据到Redshift,再导出到Quicksight完整版,含VPC配置
1. 项目背景 AWS的官方文档,关于Glue和Vpc配置部分已经比较旧了,按照官方文档配置的流程始终跑不通,花了一番时间和波折后,才终于完整的跑通了。 在数据分析和商业智能(BI)领域,我们常需要将存…...
Qt WebSockets使用
Qt WebSockets 是 Qt 官方提供的 WebSocket 协议 实现库,支持全双工通信(客户端/服务端),适用于实时交互应用(如聊天、游戏、实时数据监控)。 1. 核心功能 完整的 WebSocket 协议支持 符合 RFC 6455 标准,支持 ws:// 和 wss://(加密)。 自动处理握手、帧拆分、Ping/…...
Docker学习--容器生命周期管理相关命令--start/stop/restart命令
docker start 命令作用: 启动一个或多个已经创建的容器。 语法: docker start [参数] CONTAINER [CONTAINER…](要操作的容器的名称,可以同时操作多个) 参数解释: -a:附加到容器的标准输入输出…...
dom操作笔记、xml和document等
文章目录 mybatis dom部分 dom(Document Object Model文档对象模型)。 xml和html都属于dom,每天都会用到,一直以为很简单,直到有一天,操作mybatis的xml时候惨不忍睹,被上了一课,做个笔记整理下吧。 xml和ht…...
Python爬虫第3节-会话、Cookies及代理的基本原理
目录 一、会话和Cookies 1.1 静态网页和动态网页 1.2 无状态HTTP 1.3 常见误区 二、代理的基本原理 2.1 基本原理 2.2 代理的作用 2.3 爬虫代理 2.4 代理分类 2.5 常见代理设置 一、会话和Cookies 大家在浏览网站过程中,肯定经常遇到需要登录的场景。有些…...
OkHttpHttpClient
学习链接 okhttp github okhttp官方使用文档 SpringBoot 整合okHttp okhttp3用法 Java中常用的HTTP客户端库:OkHttp和HttpClient(包含请求示例代码) 深入浅出 OkHttp 源码解析及应用实践 httpcomponents-client github apache httpclie…...
android设备出厂前 按键测试 快速实现-屏蔽Home,Power等键
android整机测试,需要测试按键。 一般的键好按,好测试。如:音量加 ,音量- 。 但是,有些按键就不好测了。譬如:电源键(Power),Home键,Menu键,Bac…...
Spring Boot3使用Spring AI通过Ollama集成deepseek
文章目录 项目地址版本信息集成步骤 项目地址 DeepSeekSpringAI实战AI家庭医生应用 版本信息 版本Spring Boot3.4.4JDK21spring-ai1.0.0-M6ollama0.6.3LLMdeepseek:14b 集成步骤 引入依赖 <dependency><groupId>org.springframework.ai</groupId><a…...
c++柔性数组、友元、类模版
目录 1、柔性数组: 2、友元函数: 3、静态成员 注意事项 面试题:c/c static的作用? C语言: C: 为什么可以创建出 objx 4、对象与对象之间的关系 5、类模版 1、柔性数组: #define _CRT_SECURE_NO_WARNINGS #…...
