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 EXISTS:WHERE EXISTS比“IN”更好,它检查子查询是否返回结果集,能明显提高查询速度。
- 改写为JOIN:用JOIN查询替代子查询,无需建立临时表,速度快,若查询中用索引,性能更好。
优化案例
案例1:查询所有有库存的商品信息
原始查询(使用子查询):
SELECT * FROM products WHERE id IN (SELECT product_id FROM inventory WHERE stock > 0);
此查询会导致查询速度慢,影响用户体验。
优化方案(使用EXISTS):
SELECT * 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:优化…...
网络编程(1)
网络编程概述 Java是 Internet 上的语言,它从语言级上提供了对网络应用程序的支持,程序员能够很容易开发常见的网络应用程序。 Java提供的网络类库,可以实现无痛的网络连接,联网的底层细节被隐藏在 Java 的本机安装系统里&#…...
Jaeger UI使用、采集应用API排除特定路径
Jaeger使用 注: Jaeger服务端版本为:jaegertracing/all-in-one-1.6.0 OpenTracing版本为:0.33.0,最后一个版本,停留在May 06, 2019。最好升级到OpenTelemetry。 Jaeger客户端版本为:jaeger-client-1.3.2。…...
【python:文件->统计飞鸟集单词个数】
主函数.py fopen("飞鸟集.txt",r,encoding"UTF-8")#只读方式打开 contentf.read()# 提取全文,将文件内容字符串对象返回给content dccontent.split("\n")#对字符串调用分割符切割 print(dc) f.close() # 统计单词频率 ofnumcontent.count("…...
解决SpringBoot无法使用JDK8问题
解决SpringBoot无法使用JDK8问题 现状解决方案 现状 使用idea创建springboot项目无法选择java8。原因是23年11月的spring更新后就明确了不在支持java8版本的项目创建,但是目前为止很多公司开发还在用java8,导致会有问题的产生。 解决方案 使用idea创…...
论文导读 | 数据库系统中基于机器学习的基数估计方法
背景 基数估计任务是在一个查询执行之前预测其基数,基于代价的查询优化器(Cost Based Optimizer)将枚举所有可能的执行计划,并利用估计的基数选出期望执行代价最小的计划,从而完成查询优化的任务。 然而,…...
Shader->LinearGradient线性渐变着色器详解
XML文件 <com.example.myapplication.MyViewxmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_gravity"center"android:layout_height"400dp"/>自定义View代码 c…...
Unity打包+摄像机组件
转换场景 使用程序集:using UnityEngine.SceneManagement; 切换场景相关代码:SceneManager.LoadScene(1);//括号内可放入场景名称,场景索引等 //Application.LoadLevel(""); 老版本Unity加载场景方法 打包相关 Bundle Identi…...
Git 命令代码管理详解
一、Git 初相识:版本控制的神器 在当今的软件开发领域,版本控制如同基石般重要,而 Git 无疑是其中最耀眼的明珠。它由 Linus Torvalds 在 2005 年创造,最初是为了更好地管理 Linux 内核源代码。随着时间的推移,Git 凭借…...
游戏引擎学习第78天
Blackboard: Position ! Collision “网格” 昨天想到的一个点,可能本来就应该想到,但有时反而不立即思考这些问题也能带来一些好处。节目是周期性的,每天不需要全程关注,通常只是在晚上思考,因此有时我们可能不能那么…...
Centos9-SSH免密登录配置-修改22端口-关闭密码登录-提高安全性
Centos9-SSH免密登录配置-修改22端口-关闭密码登录 生成秘钥对将公钥信息存进authorized_keys测试登录查询访问记录、比对指纹更换22访问端口关闭账号密码登录生成秘钥对 生成密钥对,指定 备注 和 文件目录命令执行后,默认两次回车,不设置秘钥使用密码ssh-keygen -t rsa -b …...
汇总统计数据--SQL中聚集函数的使用
目录 1、为什么需要汇总数据 2、聚集函数 (1)AVG函数 (2)COUNT函数 (3)MAX和MIN函数 (4)SUM函数 3、聚集不同值--DISTINCT 4、组合聚集函数 5、小结 博主用的是mysql8 DBMS…...
pdf提取文本,表格以及转图片:spire.pdf
文章目录 🐒个人主页:信计2102罗铠威🏅JavaEE系列专栏📖前言:🎀 1. pdfbox1.1导入pdfbox 的maven依赖1.1 提取文本1.2 提取文本表格(可自行加入逻辑处理)1.3 pdf转换成图片代码&…...
【C#学习笔记】C#中委托
概述 C#的委托是一种类型安全的函数指针,用于引用方法,委托允许方法作为参数传递,或者将方法赋值给委托变量,并通过委托调用方法。 委托类型:委托定义了方法的的签名([方法的参数类型和返回值]࿰…...
C#的Task
优先使用Task.Run,除非有定制化需求才用Task.Factory.StartNew Task.Factory.StartNew的TaskScheduler参数颠覆你的认知: var cnt 0;var cancelToken new CancellationTokenSource();await Task.Factory.StartNew(() > {cnt;Debug.WriteLine($&quo…...
企业全文搜索-搜索权限,非侵入文档同步,权限同步 ,扩展字段
简介 企业全文搜索帮助员工高效快速定位所需的信息和资源,搜索权限控制是必须的,原因有二,首先,企业文档,包括公文,流程,技术文档等,带有敏感信息,搜索返回带片段,可能带出敏感信息;其次,若没有权限,用户搜索出来的文档可能不能阅读原文,体验非常差。onesearch有…...
Linux电源管理——CPUidle Framework
目录 前言 一、CPU idle 二、cpuidle framework 相关概念 三、cpuidle core 数据结构 3.1、cpuidle_state 3.2、cpuidle_driver 3.3、cpuidle_device 3.4、cpuidle_governor 四、cpuidle driver初始化流程 4.1、cpuidle driver 初始化方式 4.2、drv->states[0]的初…...
【黑灰产】假钱包推广套路
假钱包推广产业链研究 市面上钱包的主要推广方式: 1,竞价(搜索引擎),误导客户为真正官方钱包从而完成下载使用 优点:精准,客户大 缺点:竞价户容易挂,投资大 2࿰…...
联想java开发面试题及参考答案
IP 协议是哪一层的? IP 协议(Internet Protocol)属于网络层协议。 网络层主要负责将数据从源节点传输到目标节点,它在整个网络通信体系中起到了承上启下的关键作用。在分层网络模型中,下层(如数据链路层)为网络层提供物理链路的连接和帧传输服务。数据链路层关注的是在相…...
C# 继承(接口)
接口 如果一个类派生与一个接口,它就会执行某些函数。并不是所有的面向对象语言都支持接口。 熟悉COM的开发人员应注意,尽管在概念上C#接口类似于COM接口,但他们是不筒的,底层的结构不筒。比如,C#接口并不派生于IUnko…...
FPGA的 基本结构(Xilinx 公司Virtex-II 系列FPGA )
以Xilinx 公司Virtex-II 系列FPGA 为例,其基本结构由下图所示。它是主要由两大部分组成:可编程输入/输出(Programmable I/Os)部分和内部可配置(Configurable Logic)部分。 可编程输入/输出(I/Os…...
妙用编辑器:把EverEdit打造成一个编程学习小环境
1 妙用编辑器:把EverEdit打造成一个编程学习小环境 1.1 应用场景 最近在学习Python语言,由于只是学习和练习,代码规模很小,不想惊动PyCharm、VSCode、WingIDE这些重型武器,只想轻快的敲些代码,记事本虽好&…...
ELK日志分析实战宝典之ElasticSearch从入门到服务器部署与应用
目录 ELK工作原理展示图 一、ElasticSearch介绍(数据搜索和分析) 1.1、特点 1.2、数据组织方式 1.3、特点和优势 1.3.1、分布式架构 1.3.2、强大的搜索功能 1.3.3、数据处理与分析 1.3.4、多数据类型支持 1.3.5、易用性与生态系统 1.3.6、高性…...
【学习笔记】理解深度学习和机器学习的数学基础:数值计算
深度学习作为人工智能领域的一个重要分支,其算法的实现和优化离不开数值计算。数值计算在深度学习中扮演着至关重要的角色,它涉及到如何在计算机上高效、准确地解决数学问题。本文将介绍深度学习中数值计算的一些关键概念和挑战,以及如何应对…...
【Java回顾】Day5 并发基础|并发关键字|JUC全局观|JUC原子类
JUC全称java.util.concurrent 处理并发的工具包(线程管理、同步、协调) 一.并发基础 多线程要解决什么问题?本质是什么? CPU、内存、I/O的速度是有极大差异的,为了合理利用CPU的高性能,平衡三者的速度差异,解决办法…...
VSCODE使用Echarts组件库(不是vue)
第一步打开Echarts官网 Examples - Apache ECharts 第二步随便点击一个图形点击我圈的按钮 第三步...
DNS解析域名简记
域名通常是由: 权威域名.顶级域名.根域名组成的。 从左往右,级别依次升高,这和外国人从小范围到大范围的说话习惯相关。(我们自己是更习惯先说大范围再说小范围,如XX省XX市XX区XX路) DNS解析域名时,会先查…...
选择器css
1.a标签选择 // 选中所具有herf 的元素 [herf] {color: skyblue; } // 选中所具有herfhttps://fanyi.youdao.com/ 的元素 [herf$"youdao.com"] {color:pink; } // 按此顺序书写 link visited hover active // 未访问状态 a:link {color:orange } // 访问状态 a…...
9.4 visualStudio 2022 配置 cuda 和 torch (c++)
一、配置torch 1.Libtorch下载 该内容看了【Libtorch 一】libtorchwin10环境配置_vsixtorch-CSDN博客的博客,作为笔记用。我自己搭建后可以正常运行。 下载地址为windows系统下各种LibTorch下载地址_libtorch 百度云-CSDN博客 下载解压后的目录为: 2.vs…...
ASP.NET Core 实现微服务 -- Polly 服务降级熔断
在我们实施微服务之后,服务间的调用变的异常频繁。多个服务之间可能是互相依赖的关系。某个服务出现故障或者是服务间的网络出现故障都会造成服务调用的失败,进而影响到某个业务服务处理失败。某一个服务调用失败轻则造成当前相关业务无法处理࿱…...
2_CSS3 背景 --[CSS3 进阶之路]
CSS3 中的背景属性提供了许多强大的功能来增强网页设计,包括但不限于多背景图像、渐变、背景大小控制等。以下是一些关键的 CSS3 背景属性及其用法示例。 1. 多重背景图像 CSS3 允许你为一个元素设置多个背景图像。这些图像按照它们在 background-image 属性中定义…...
于交错的路径间:分支结构与逻辑判断的思维协奏
大家好啊,我是小象٩(๑ω๑)۶ 我的博客:Xiao Xiangζั͡ޓއއ 很高兴见到大家,希望能够和大家一起交流学习,共同进步。* 这一节内容很多,文章字数达到了史无前例的一万一,我们要来学习分支与循环结构中…...
升级 CentOS 7.x 系统内核到 4.4 版本
问题描述 在 CentOS 7.x 系统中,默认内核版本是 3.10.x,这个版本可能会带来一些与 Docker 和 Kubernetes 兼容性的问题,导致系统性能不稳定或功能异常。为了提高系统的稳定性和兼容性,建议升级到更高版本的内核,例如 …...
MySQL数据导出导入
一、数据导出 1.导出全库备份到本地的目录 mysqldump -u$USER -p$PASSWD -h127.0.0.1 -P3306 --routines--default-character-setutf8 --lock-all-tables --add-drop-database -A >db.all.sql 2.导出指定库到本地的目录(例如mysql库) mysqldump -u$USER -p$PASSWD -h127.…...
【机器学习:八、逻辑回归】
逻辑回归(Logistic Regression) 1. 逻辑回归的引出 在现实世界中,许多问题都涉及到分类任务。例如: 判断一封邮件是否为垃圾邮件;预测某人是否会患某种疾病;确定图片中是否包含某种特定物体。 这些问题…...
uniapp使用sm4加密
安装:npm install sm-crypto --save 1、在utils下新建crypto.js文件 // sm4 加密 export function encryption(params) {const SM4 require("sm-crypto").sm4const key 0123456789abcdeffedcba9876543212; // 提供的密钥const iv fedcba9876543210012…...
【STM32-学习笔记-1-】GPIO
文章目录 GPIOⅠ、GPIO函数Ⅱ、GPIO_InitTypeDef结构体参数①、GPIO_Mode②、GPIO_Pin③、GPIO_Speed GPIO Ⅰ、GPIO函数 // 将指定的GPIO端口寄存器重置为默认值 void GPIO_DeInit(GPIO_TypeDef* GPIOx);// 将GPIO的备用功能寄存器重置为默认值 void GPIO_AFIODeInit(void);…...
C#中的运算符和类--06
目录 一.运算符 1.赋值运算符 2.算数运算符 3.关系运算符 4.逻辑运算符 5.位运算符 6.三元运算符 7.空合并运算符 8.其他运算符 二.类 1.普通类 2.静态类 3.抽象类 4.密封类 5.部分类 6.泛型类 7.嵌套类 8.记录类 9.接口 一.运算符 1.赋值运算符 定义:赋值…...
【微服务】面试 2、服务雪崩
服务雪崩概念 主要内容:在微服务项目中,微服务间存在远程调用。若某一服务(如服务 d)出现故障,调用它的服务(如服务 a)会失败。若调用方持续向故障服务发起请求,由于服务连接数有限且…...
“深入浅出”系列之QT:(6)如何在一个项目中调用另一个项目
在Qt中,如果想在一个项目中调用另一个项目,这通常意味着想要在一个CMake构建的项目中集成或依赖另一个CMake构建的项目。 1.子模块或子目录方式: 如果另一个项目可以作为一个子模块或子目录包含在当前项目中,可以使用add_sub…...
计算机网络—地址与子网(IPv4)相关知识总结
前言 为了更加清楚的了解该相关知识,下面是发现的一些宝藏博主的博客。 彻底搞懂网络地址、广播地址、主机地址、网关、子网掩码、网络号、主机号 - lipga - 博客园 IP地址(分类)、子网掩码、网络号、主机号、子网号_网络号,主机号,子网号…...
计算机网络 (36)TCP可靠传输的实现
前言 TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP通过多种机制实现可靠传输,这些机制主要包括连接管理、序列号和确认应答机制、重传机制、流量控制、拥塞控制等。 一、连接管理 TCP使用三次握手࿰…...
SQL从入门到实战-2
高级语句 窗口函数 排序窗口函数 例题二十九 select yr,party,votes, rank() over (PARTITION BY yr ORDER BY votes desc) as pson from ge where constituency S14000021 order by party,yr 偏移分析函数 例题三十 select name,date_format(whn,%Y-%m-%d) data, confi…...
基于python的网页表格数据下载--转excel
基于 Python 的网页表格数据爬取与下载:以维基百科为例 目录 基于 Python 的网页表格数据爬取与下载:以维基百科为例1. 背景介绍2. 工具与环境3. 操作步骤1. 获取网页内容2. 定位表格元素3. 表格变身 Pandas DataFrame4. 检查数据,收工!5. 进阶玩法与优化6. 完整代码4. 结果…...
用户界面的UML建模13
􀂄 Concrete Presentation Model 包中所包含的是,在Environment 包中与表示层框架模式中的《apm》类相对应的那些类。 8 结论 本文使用了一个图书馆系统的案例,来论述了关于用户界面的建模。通过使用统一建模语言来对应用系统进行建模&…...
[Python学习日记-75] 计算机基础与网络
[Python学习日记-75] 计算机基础与网络 简介 计算机基础 什么是网络编程 计算机网络 简介 本篇主要介绍的计算机基础是浓缩的,这是因为我们主要学习的是 Python,而 Python 主要是为了开发应用程序的,并不会用它来开发操作系统和嵌入式程序…...
【机器学习:六、特征工程】
1. 特征工程背景意义 在机器学习中,特征工程是模型成功的关键之一。无论算法多么先进,其性能都很大程度上依赖于输入数据的质量。特征工程是指对原始数据进行处理,以创建更适合算法的特征的过程。这一过程在以下方面具有重要意义:…...
webpack打包要义
webpack基本 Webpack 是一个现代 JavaScript 应用程序的静态模块打包工具。它的工作原理可以概括为以下几个核心步骤: 1. 入口起点(Entry) Webpack 从配置文件中指定的入口文件(Entry Point)开始,分析应用…...
Mybatis——Mybatis开发经验总结
摘要 本文主要介绍了MyBatis框架的设计与通用性,阐述了其作为Java持久化框架的亮点,包括精良的架构设计、丰富的扩展点以及易用性和可靠性。同时,对比了常见持久层框架,分析了MyBatis在关系型数据库交互中的优势。此外࿰…...
013:深度学习之神经网络
本文为合集收录,欢迎查看合集/专栏链接进行全部合集的系统学习。 合集完整版请参考这里。 深度学习是机器学习中重要的一个学科分支,它的特点就在于需要构建多层且“深度”的神经网络。 人们在探索人工智能初期,就曾设想构建一个用数学方式…...