針對 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.pswp.cn/news/900343.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/900343.shtml
英文地址,請注明出處:http://en.pswp.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;命令行登錄 …