当前位置: 首页 > article >正文

MySQL不使用子查询的原因

MySQL不使用子查询的原因及优化案例目录MySQL不使用子查询的原因及优化案例目录不推荐使用子查询和JOIN的原因解决方案优化案例案例1查询所有有库存的商品信息案例2使用EXISTS优化子查询案例3使用JOIN代替子查询案例4优化子查询以减少数据量案例5使用索引覆盖案例6使用临时表优化复杂查询案例7使用窗口函数替代子查询案例8优化子查询以避免全表扫描案例9使用LIMIT子句限制子查询返回数据量案例10使用JOIN代替子查询以利用索引总结不推荐使用子查询和JOIN的原因在MySQL中不推荐使用子查询和JOIN主要有以下原因性能问题子查询执行时MySQL需创建临时表存储内层查询结果查询完再删除增加CPU和IO资源消耗易产生慢查询。JOIN操作效率也较低尤其数据量大时性能难保证。索引失效子查询可能使索引失效MySQL会将查询转为联接执行子查询不能先执行若外表大性能受影响。查询优化器复杂度子查询影响查询优化器判断致执行计划不够优化。相比之下联表查询更易被优化器理解和处理。数据传输开销子查询可能致大量不必要数据传输每个子查询都需将结果返回给主查询。而联表查询可通过一次查询返回所有所需数据减少数据传输开销。维护成本使用JOIN写的SQL语句在修改表schema时较复杂成本大尤其系统大时不易维护。解决方案针对这些问题可采取以下解决方案应用层关联在业务层单表查询出数据后作为条件给下一个单表查询减少数据库层负担。使用IN代替子查询若子查询结果集小可用“IN”操作符查询数据量小时查询效率更高。使用WHERE EXISTSWHERE EXISTS比“IN”更好它检查子查询是否返回结果集能明显提高查询速度。改写为JOIN用JOIN查询替代子查询无需建立临时表速度快若查询中用索引性能更好。优化案例案例1查询所有有库存的商品信息原始查询使用子查询SELECT * FROM products WHERE id IN (SELECT product_id FROM inventory WHERE stock 0);此查询会导致查询速度慢影响用户体验。优化方案使用EXISTSSELECT * FROM products WHERE EXISTS (SELECT 1 FROM inventory WHERE inventory.product_id products.id AND inventory.stock 0);该优化方案可大幅提升查询速度改善用户体验。案例2使用EXISTS优化子查询原始查询SELECT * FROM orders WHERE customer_id IN (SELECT customer_id FROM customers WHERE country USA);优化方案SELECT * FROM orders WHERE EXISTS (SELECT 1 FROM customers WHERE orders.customer_id customers.customer_id AND customers.country USA);使用EXISTS代替IN子查询可减少回表查询次数提高查询效率。案例3使用JOIN代替子查询原始查询SELECT * FROM orders WHERE customer_id IN (SELECT customer_id FROM customers WHERE country USA);优化方案SELECT o.* FROM orders o JOIN customers c ON o.customer_id c.customer_id WHERE c.country USA;使用JOIN代替子查询可减少子查询开销且更容易利用索引。案例4优化子查询以减少数据量原始查询SELECT * FROM orders WHERE customer_id IN (SELECT customer_id FROM customers);优化方案SELECT * FROM orders WHERE customer_id IN (SELECT customer_id FROM customers WHERE active 1);限制子查询返回数据量减少主查询需检查的行数提高查询效率。案例5使用索引覆盖原始查询SELECT customer_id FROM customers WHERE country USA;优化方案CREATE INDEX idx_country ON customers(country); SELECT customer_id FROM customers WHERE country USA;为country字段创建索引使子查询可直接在索引中找到数据避免回表查询。案例6使用临时表优化复杂查询原始查询SELECT * FROM orders WHERE customer_id IN (SELECT customer_id FROM customers WHERE last_order_date 2023-01-01);优化方案CREATE TEMPORARY TABLE temp_customers AS SELECT customer_id FROM customers WHERE last_order_date 2023-01-01; SELECT * FROM orders WHERE customer_id IN (SELECT customer_id FROM temp_customers);对于复杂子查询用临时表存储中间结果简化查询并提高性能。案例7使用窗口函数替代子查询原始查询SELECT employee_id, salary, (SELECT AVG(salary) FROM employees WHERE department_id e.department_id) AS avg_salary FROM employees e;优化方案SELECT employee_id, salary, AVG(salary) OVER (PARTITION BY department_id) AS avg_salary FROM employees;用窗口函数替代子查询提高查询效率。案例8优化子查询以避免全表扫描原始查询SELECT * FROM users WHERE username IN (SELECT username FROM orders WHERE order_date 2024-01-01);优化方案CREATE INDEX idx_order_date ON orders(order_date); SELECT * FROM users WHERE username IN (SELECT username FROM orders WHERE order_date 2024-01-01);为order_date字段创建索引避免全表扫描提高子查询效率。案例9使用LIMIT子句限制子查询返回数据量原始查询SELECT * FROM orders WHERE customer_id IN (SELECT customer_id FROM customers WHERE country USA);优化方案SELECT * FROM orders WHERE customer_id IN (SELECT customer_id FROM customers WHERE country USA LIMIT 100);用LIMIT子句限制子查询返回数据量减少主查询需处理数据量提高查询效率。案例10使用JOIN代替子查询以利用索引原始查询SELECT * FROM transactions WHERE product_id IN (SELECT product_id FROM products WHERE category Equity);优化方案SELECT t.* FROM transactions t JOIN products p ON t.product_id p.product_id WHERE p.category Equity;用JOIN代替子查询并可更容易利用products表上category索引。总结这些案例展示了如何通过不同优化策略提升MySQL查询性能特别是在处理子查询时。以下是一些额外的优化建议创建合适的索引经常用于WHERE和JOIN的字段应建立索引避免在低选择性的字段上建立索引如性别字段。避免索引失效的情况使用函数计算的字段不会使用索引如SELECT * FROM orders WHERE YEAR(order_date) 2023;应优化为SELECT * FROM orders WHERE order_date 2023-01-01;。组合索引的最左前缀法则确保查询条件从组合索引的最左列开始。使用EXPLAIN分析查询执行计划通过EXPLAIN关键字可以帮助我们了解查询的执行计划从而发现性能瓶颈。优化查询语句避免使用SELECT *使用LIMIT限制返回行数重写子查询为JOIN。合理调整Join Buffer在无索引或索引不可用的情况下Join Buffer是优化Block Nested-Loop Join的关键其大小直接影响外层表加载的行数和内层表的扫描效率。通过这些优化策略可以显著提升MySQL查询性能改善用户体验。

相关文章:

MySQL不使用子查询的原因

MySQL不使用子查询的原因及优化案例 目录 MySQL不使用子查询的原因及优化案例 目录不推荐使用子查询和JOIN的原因解决方案优化案例 案例1:查询所有有库存的商品信息案例2:使用EXISTS优化子查询案例3:使用JOIN代替子查询案例4:优化…...

荣事达3.18榜上产品 AI智能养生壶功能介绍

荣事达智能养生壶 AI 伙伴__自叙一款超暖心的养生神器------荣事达智能养生壶,里面藏着超贴心的中国AI女孩,就是我,你的专属养生AI伙伴!我来自荣电集团,专管一家人的茶饮香与养生暖,是住在家中茶台的“养生…...

@SpringBootApplication 与 SPI 机制的终极解密

敲代码离不开springboot,少了springboot谁还来替我当牛马——ai欢迎来到 Spring Boot 的“后台控制室”~刚开始、小白的你是否曾有过这样的错觉:“我就加了一个 SpringBootApplication 注解,连 application.properties 都没怎么写…...

1.2指令系统-存储系统-cache

一、指令系统 00:02 1. 计算机指令的组成 00:03 基本结构:由操作码和操作数两部分组成,以二进制编码形式存放在存储器中操作码:决定要完成的操作(如加法、减法),用二进制数码表示操…...

水厂、电站、化工厂用的闸阀一样吗?

闸阀是工业里最常用的全开全关型阀门,很多人以为闸阀都是通用的,不管哪个行业都是同一种。但实际上,水厂、电站、化工厂的工况天差地别,对应的闸阀在材质、压力、密封等标准上完全不一样,用错了轻则可能漏液&#xff0…...

S7-1200 PLC 高级语言SCL数控G代码功能块源文件

S7-1200PLC 高级语言SCL数控G代码功能块源文件 整个G代码解析的程序做成了一个FB功能块,利用1200PLC内置的字符串控制指令来实现拆分提取字符串信息;整个程序的大概思路就是1.解析指令 2.提取数据 3.判断书否输入有错误 把提取出来的数据对应上并且赋…...

新概念英语第一册037_Making a bookcase

Lesson 37: Making a bookcase. Watch the story and answer the question What is Susan’s favourite colour? Pink.Key words and expressions work 工作hard adv. 努力地make 做bookcase 书橱,书架hammer 锤子paint …...

【AI】创建 claude code cli 风格的欢迎界面

使用高级 ANSI 字体生成器(Text to ANSI) 不要局限于 Python 自带的 pyfiglet 字体。你可以去一些专业的 ANSI Art 网站生成文本,然后直接把生成的字符串复制到代码里。 去 TAAG (Text to ASCII Art Generator)。 尝试使用 Sub-Zero、ANSI …...

【网络安全入门】一文讲透:核心属性、主流攻击手法与防御体系

网络安全(Network Security)是指通过采取必要措施,防范对网络的攻击、侵入、干扰、破坏和非法使用以及意外事故,使网络处于稳定可靠运行的状态,以及保障网络数据的完整性、保密性、可用性的能力。通俗来说,…...

OpenClaw:新一代AI Agent开发平台,让聊天更智能

OpenClaw:新一代AI Agent开发平台 OpenClaw是一个强大的AI Agent开发框架,支持多种通信渠道。 核心特性 多渠道支持内置浏览器控制强大的记忆系统 为什么选择OpenClaw? 开源免费:基于MIT协议,完全开源易于扩展&am…...

不断提升维修技能是医疗器械维修工程师职业发展更好的必要条件

凛冬已过,春山可望,在医疗维修行业经过这两年的洗牌,未来将变得更干净、透明,留下的也将是更健康且有活力的行业生态。长远来看医疗器械售后维修这块更是走向高质量发展路径。不断提升维修技能是医疗器械维修工程师职业发展更好的…...

作业:​在AI工具的辅助下,创建一个校园管理系统——主营方向是二手物品交易

-- 1. 插入用户信息(12条) INSERT INTO user_info (user_no, user_name, user_type, user_phone, user_college) VALUES (20240101, 张三, student, 13800138001, 计算机学院), (20240102, 李四, student, 13800138002, 电子工程学院), (20240103, 王五,…...

AI私域获客生产厂家

一、公司概况 上海超客多多智能科技有限公司是一家专注于AI驱动企业增长的科技服务公司。其核心使命是助力中小企业、工厂型企业和实体商家,以更低的成本、更少的人力构建一套可复制、可规模化的线上获客与成交体系。二、核心产品 - AI自运转百倍获客体系整体功能 这…...

别只盯着银含量——银包镍粉的性能密码藏在核芯形貌里

引言买银包镍粉,很多采购工程师第一个问题是:"银含量多少?"这个问题没错,但只问这一个,你很可能选错料。在银包镍粉的世界里,有一个反直觉的核心规律:决定产品性能上限的,…...

前后端数据加密传输,crypto前端加密后端解密 js+java

前端页面引用js,注意引用顺序&#xff0c;否则可能会报错。 <script type"text/javascript" src"${ctx!}/static/js/crypto-js.js"></script> <script type"text/javascript" src"${ctx!}/static/js/aes.js"></s…...

STM32_TIM_定时器

文章目录一、定时器二、基本定时器   1、时钟源   2、计数器时钟   3、计数器   4、自动重装载寄存器   5、定时时间的计算三、高级定时器   1、高级定时器框图   2、高级定时器引脚分布   3、高级定时器功能图     1.时钟源     2.控制器     3.时…...

红队打点,蓝队断后!万字长文拆解内网攻防实战中的那些关键技战术

我们来聊聊网络安全领域中一个非常重要的实战概念&#xff1a;红蓝对抗。 简单来说&#xff0c;红蓝对抗是一种网络安全的实战攻防演练。它借鉴了军事演习的概念&#xff0c;旨在通过模拟真实的网络攻击&#xff0c;来检验和提升一个组织&#xff08;比如一家公司、一个单位甚…...

JS 开发问题:url.includes is not a function

在 JavaScript 开发中&#xff0c;出现如下错误信息 Uncaught TypeError: url.includes is not a function问题原因 这个错误是&#xff0c;尝试调用 url 的 includes 方法&#xff0c;但 url 不是一个字符串 问题复现 例如&#xff0c;url 是一个数字 let url 123;if (u…...

基于深度学习的征信报告结构化提取技术架构与实践

在金融科技&#xff08;FinTech&#xff09;领域&#xff0c;信贷风控系统的核心在于数据。然而&#xff0c;作为风控最关键的数据源之一&#xff0c;人行征信报告在部分场景下会以非结构化或半结构化的 PDF/图片形式存在。 对于开发者而言&#xff0c;如何将这些非结构化文档…...

JavaEE零基础入门指南

JavaEE零基础完整入门指南 一、JavaEE概述与学习路径规划 1.1 JavaEE基本概念 JavaEE&#xff08;Java Platform, Enterprise Edition&#xff09;是Sun公司&#xff08;现Oracle&#xff09;推出的企业级应用开发平台&#xff0c;主要用于构建大规模、分布式、多层次的企业…...

高压直流输电在线监测Matlab仿真模型:包含故障监测与GUI界面参数设置功能

高压直流输电在线监测Matlab仿真模型 本设计对故障监测&#xff0c;同时设置了GUI界面&#xff0c;可以设置参数等等一、系统开发背景与核心目标 在电力系统“强直弱交”特性持续增强的背景下&#xff0c;大规模直流互联引发的送、受端交流系统相互影响日益凸显&#xff0c;对…...

从手工账本到数字时代:美业管理者的进化之路

凌晨十一点&#xff0c;美发店的镜子前&#xff0c;发型师还在为一位延迟的顾客整理头发&#xff1b;隔壁美容院的咨询间里&#xff0c;顾问耐心地解释着会员卡权益&#xff1b;收银台前&#xff0c;店长翻看着厚厚的记录本&#xff0c;计算着当天的业绩。这样的场景&#xff0…...

深入解析 LangGraph Checkpoint

一、LangGraph Checkpoint 的核心设计目标 LangGraph Checkpoint 解决的并不是简单的“存储状态”问题&#xff0c;而是 复杂工作流系统中的可恢复执行问题。 从架构角度看&#xff0c;它承担了四个关键职责&#xff1a; 1️⃣ 持久化状态管理 保存 Graph 的完整状态&#x…...

Harmonyos应用实例128:正方体展开图辨识

应用实例八:正方体展开图辨识 知识点:第四章《几何图形初步》—— 立体图形的展开图。 功能:展示各种平面图形(1-4-1型、2-3-1型等)。学生判断该图形能否围成正方体。点击"折叠"按钮,演示3D折叠动画验证答案,培养空间想象能力。 /*** 正方体平面展开图与折…...

历时100天,亿元Cocos小游戏实战合集顺利完结!!!

引言 哈喽大家好&#xff0c;我是亿元程序员。 还记得100天前&#xff0c;在《100个Cocos实例》合集完成三分之二时&#xff0c;曾暗暗“发誓”&#xff1a;一定要启动一个更聚焦、更实用的新系列。 于是&#xff0c;《亿元Cocos小游戏实战合集》就此诞生。 这个系列&#…...

openclaw 飞书表情包发送器

openclaw 飞书表情包发送器 github地址 功能 1.在回复了用户消息后,自动调用接口发送表情包图片2.支持概率命中,即概率发送&#xff08;默认60%概率&#xff09;3.不影响主回复消息 使用教程 1.需要依赖飞书官方的插件&#xff08;非openclaw原生飞书插件&#xff09; np…...

VS Code + LaTex + SumatraPDF联合使用指南

&#x1f9f8; VS Code 与 TexLive SumatraPDF 下载安装 我们就以TexLive为排版系统&#xff0c;用VS Code做编辑器&#xff0c;我本来也是有安装TexStudio的&#xff0c;但因为一直用的VS Code&#xff0c;比较习惯&#xff0c;并且VS Code的界面个人感觉要比TexStudio要好看…...

计算机网络相关知识

1. 计算机网络基础概念计算机网络是指通过通信设备和线路将地理位置不同的、具有独立功能的计算机系统连接起来&#xff0c;在网络软件的支持下实现资源共享和信息传递的系统。按照覆盖范围可分为&#xff1a;局域网&#xff08;LAN&#xff09;&#xff1a;覆盖范围较小&#…...

从理论到实践:打造坚不可摧的 Redis 缓存体系

在现代高并发应用架构中&#xff0c;Redis 几乎是缓存层的标配。然而&#xff0c;简单地将数据放入 Redis 并不能解决所有问题。如何设计一个既能扛住流量洪峰&#xff0c;又能保证数据一致性&#xff0c;并且易于维护的缓存系统&#xff0c;才是真正的挑战。本文将基于大厂实战…...

GTC 2026落幕:AI 不再是模型,而是AgenticOps

AI 不再是模型 而是AgenticOps GTC 2026 刚刚落幕&#xff0c;Jensen Huang 站在台上说出了一个词&#xff1a;AI Factory。 不是模型&#xff0c;不是算法&#xff0c;是工厂。 这个词的出现&#xff0c;其实在验证一件事&#xff1a;OpenCSG 从一开始就走对了方向。 这个…...