针对 SQL 查询中 IN 子句性能优化 以及 等值 JOIN 和不等值 JOIN 对比 的详细解决方案、代码示例及表格总结

以下是针对 SQL 查询中 IN 子句性能优化 以及 等值 JOIN 和不等值 JOIN 对比 的详细解决方案、代码示例及表格总结:


问题 1:IN 的候选值过多(如超过 1000 个)

问题描述

IN 列表中的值过多时,SQL 会逐个比较每个值,导致性能下降(尤其是全表扫描时)。

解决方案

IN 列表转换为 临时表或 CTE,并通过 JOINEXISTS 优化查询。

代码示例
-- 创建临时表存储候选值
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
);
性能提升原因
  1. 减少 IN 列表的内存消耗:临时表或 CTE 将数据存储在内存中,避免单条 SQL 的参数列表过长。
  2. 利用索引加速关联:通过 JOINEXISTS,数据库可以利用临时表的索引优化查询。

问题 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;
性能提升原因
  1. EXISTS 的短路机制EXISTS 在找到第一个匹配时立即返回,避免遍历所有结果。
  2. 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;
性能对比
类型写法性能原因
等值 JOINON a = b高效可利用索引,执行计划为直接关联。
不等值 JOINON a > b低效无法有效利用索引,可能导致全表扫描或笛卡尔积。

总结表格

问题类型解决方案示例代码片段性能提升原因
IN 候选值过多临时表 + JOIN/EXISTSJOIN temp_values ON ...EXISTS (SELECT 1 FROM temp_values ...)减少参数列表长度,利用索引加速关联。
IN 候选值是表的列替换为 EXISTS 或 JOINEXISTS (SELECT 1 FROM customers ...)JOIN customers ON ...EXISTS 短路优化;JOIN 利用索引,减少全表扫描。
等值 JOIN直接使用 ON a = bJOIN ... ON orders.customer_id = customers.customer_id可利用索引,执行计划高效。
不等值 JOIN优化条件或缩小范围WHERE o.order_date > c.registration_date(结合等值 JOIN)避免直接使用不等值 JOIN,改用条件过滤缩小数据范围。

关键注意事项

  1. 索引优化:确保关联列(如 customer_id, order_id)在两个表中均有索引。
  2. 临时表清理:使用完临时表后及时删除(DROP TEMPORARY TABLE temp_values)。
  3. 查询分析:通过 EXPLAIN 分析执行计划,确认索引是否被正确使用。

通过上述方法,可显著提升 IN 子句和 JOIN 的查询性能。

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

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

相关文章

手部穴位检测技术:基于OpenCV和MediaPipe的实现

手部穴位检测是医学和健康管理领域的重要技术之一。通过准确识别手部的关键穴位,可以为中医诊断、康复治疗以及健康监测提供支持。本文将介绍一种基于OpenCV和MediaPipe的手部穴位检测方法,展示如何利用计算机视觉技术实现手部关键点的检测,并进一步标注手部的穴位位置。 技…

Day20 -自动化信息收集工具--ARL灯塔的部署

准备&#xff1a; 纯净的Docker环境 ARL的包 一、Docker的部署 00x1 更新系统包 sudo apt update 00x2 安装必要的依赖包 sudo apt install -y apt-transport-https ca-certificates curl software-properties-common 00x3 下载docker和docker-compose apt-get install do…

sqlalchemy查询json

第一种&#xff1a;字段op是json格式&#xff1a; {"uid": "cxb123456789","role": 2,"op_start_time": 1743513707504,"op_end_time": 1743513707504,"op_start_id": "op_001","op_end_id"…

搭建K8S-1.23

0、简介 这里只用3台服务器来做一个简单的集群 地址主机名192.168.160.40kuber-master-1192.168.160.41kuber-master-2192.168.160.42kuber-node-1 1、关闭三个服务 &#xff08;1&#xff09;防火墙 systemctl stop firewalld &#xff08;2&#xff09;Selinux setenf…

初阶数据结构--树

1. 树的概念与结构 树是⼀种⾮线性的数据结构&#xff0c;它是由 n&#xff08;n>0&#xff09; 个有限结点组成⼀个具有层次关系的集合。把它叫做 树是因为它看起来像⼀棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;⽽叶朝下的。 有⼀个特殊的结点&#xff0c;称…

硬件工程师面试问题(五):蓝牙面试问题与详解

蓝牙技术作为物联网与智能设备的核心无线协议&#xff0c;其硬件设计能力直接影响产品连接稳定性、功耗及兼容性。面试是评估候选人射频电路设计、天线优化、协议栈调试等综合技能的关键环节&#xff0c;尤其在BLE低功耗设计、共存抗干扰等场景中&#xff0c;硬件工程师的实践经…

Redis-基本数据类型

Redis支持的基本数据类型&#xff1a;String、hash、list、Set、Zset 一、String 特点 可以存储三种类型 int、float、string 运用场景 缓存&#xff1a;存储HTML片段、用户会话&#xff08;Session&#xff09;计数器&#xff1a;网站访问量、点赞数&#xff08;incr方法&am…

Tomcat的部署

Tomcat 服务器是一个免费的开放源代码的Web 应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和 并发访问用户不是很多的场合下被普遍使用&#xff0c;Tomcat 具有处理HTML页面的功能&#xff0c;它还是一个Servlet和 JSP容器 官网:Apache Tomcat - Welco…

Linux的TCP连接数到达2万,其中tcp_tw、tcp_alloc、tcp_inuse都很高,可能出现什么问题

当 Linux 系统的 TCP 连接数达到 2 万,且 /proc/net/sockstat 中的 tcp_tw(TIME_WAIT 连接)、tcp_alloc(已分配但未完全建立的连接)和 tcp_inuse(正在使用的连接)均处于高位时,可能会引发以下问题: 一、关键指标分析 通过 /proc/net/sockstat 可以查看 TCP 连接状态:…

服务器数据恢复—Raid6阵列硬盘故障掉线,上层虚拟机数据如何恢复?

服务器数据恢复环境&故障&#xff1a; 一台由16块硬盘组成的raid6磁盘阵列。磁盘阵列中有一块硬盘因为物理故障掉线&#xff0c;导致服务器上层虚拟机无法正常使用&#xff0c;部分分区丢失&#xff0c;重启物理服务器后发现数据丢失。 服务器数据恢复过程&#xff1a; 1、…

Unhandled exception: org.apache.poi.openxml4j.exceptions.InvalidFormatException

代码在main方法里面没有报错&#xff0c;在Controller里面就报错了。 原来Controller类里面少了行代码 import org.apache.poi.openxml4j.exceptions.InvalidFormatException; 加上去就解决了。

RISC-V debug专栏2 --- Debug Module(DM)

Debug Module&#xff08;DM&#xff09;的核心功能 DM 就像一个翻译官&#xff0c;负责把调试器的抽象指令&#xff08;比如 “暂停处理器”&#xff09;转换成硬件能听懂的具体操作。它必须实现以下基本功能&#xff1a; 必要功能&#xff08;必须实现&#xff09;&#xff…

infinityfree最新免费建站详细教程_无需备案_5G空间_无限流量_免费域名_免费SSL

一、明确目标—是否要使用 1.为什么选择InfinityFree&#xff1f; 对于初学者、学生或只是想尝试网站搭建的个人用户来说&#xff0c;InfinityFree提供了一个绝佳的免费解决方案。这个国外免费的虚拟主机服务提供&#xff1a; 5GB存储空间 - 足以存放个人博客、作品集或小型…

我与数学建模之终章

自美赛失利之后&#xff0c;就开始忙活别的了&#xff0c;因为数学竞赛国赛当时还没收到通知&#xff0c;所以就在准备写论文&#xff0c;最后论文拿去交挑战杯竞赛了&#xff0c;拿了个校一省一国三。 在写论文过程中&#xff0c;通知去上海参加数学竞赛&#xff0c;其实当时…

大学生机器人比赛实战(三)经验篇

大学生机器人比赛一等奖实战指南&#xff1a;从组队到夺冠的全流程策略 参加大学生机器人比赛并斩获一等奖是许多理工科学子的梦想&#xff0c;这不仅是对技术能力的认可&#xff0c;更是未来深造和就业的重要加分项。本文将从团队组建、技术攻关、项目管理、比赛策略和心理建…

关于UDP端口扫描概述

尽管互联网上大多数流行服务都基于 TCP 协议运行&#xff0c;但 UDP 服务也广泛部署。DNS、SNMP 和 DHCP&#xff08;注册端口 53、161/162 和 67/68&#xff09;是最常见的服务之一。 由于 UDP 扫描通常比 TCP 扫描更慢、更困难&#xff0c;一些安全审计人员可能会忽略这些端…

美团滑块 分析

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 逆向过程 距离识别不准简单学习一下&…

SpringBoot配置文件多环境开发

目录 一、设置临时属性的几种方法 1.启动jar包时&#xff0c;设置临时属性 ​2.idea配置临时属性 3.启动类中创建数组指定临时属性 二、多环境开发 1.包含模式 2.分组模式 三、配置文件的优先级 1.bootstrap 文件优先&#xff1a; 2.特定配置文件优先 3.文件夹位置优…

开发一个小程序需要多久时间?小程序软件开发周期

开发一个小程序所需时间受多种因素影响&#xff0c;以下为你详细列举&#xff1a; 一、需求复杂度。若只是简单展示类小程序&#xff0c;如企业宣传、产品介绍&#xff0c;功能单一&#xff0c;大概 1 - 2 周可完成。若涉及复杂交互&#xff0c;像电商小程序&#xff0c;涵盖商…

Linux 基础入门指南:用户管理、基本命令(一)

摘要&#xff1a;Xshell登录、用户管理、修改字体与配色方案。操作系统概要。Linux文件系统基础。相关命令&#xff1a;pwd, ls, cd, mkdir, rmdir, rm,touch, nano, tree; adduser, passwd 目录 一、系统登录与用户管理 1. 登录方式 &#xff08;1&#xff09;命令行登录 …