MySQL中 in 和 exists 区别

在MySQL中,IN和EXISTS都是用于在子查询中测试条件的操作符,但它们在处理和效率上有一些重要的区别。MySQL中的in语句是把外表和内表作hash连接,⽽exists语句是对外表作loop循环,每次loop循环再对内表进⾏查询。⼤家⼀直认为exists⽐in语句的效率要⾼,这种说法其实是不准确的。这个是要区分环境的。
如果查询的两个表⼤⼩相当,那么⽤in和exists差别不⼤。 如果两个表中⼀个较⼩,⼀个是⼤表,则⼦查询表⼤的⽤exists,⼦查询表⼩的⽤in。

处理方式:

IN: 当使用IN子查询时,查询首先执行子查询,然后将其结果与外部查询的每一行进行比较。这意味着子查询的结果集必须适合内存,并且结果集的大小对性能有很大影响。
EXISTS: 与IN不同,EXISTS子查询在每次外部查询的行与子查询返回任何行时评估一次。这意味着子查询通常只返回一个值(即使对于每个外部查询的行),这使得其结果集的大小对性能的影响较小。

效率:

当子查询返回的结果集很大时,使用IN可能会导致性能问题,因为所有结果都需要加载到内存中。而EXISTS通常在这种情况下更高效,因为它只需要检查是否存在至少一个匹配的行,而不是检查所有行。
另一方面,当子查询返回的结果集很小并且可以适应内存时,使用IN可能更高效,因为它可以避免多次打开和关闭游标等操作。

优化:

使用EXISTS的查询通常更易于优化,因为它们通常只返回一个值。这使得索引的使用更加有效,从而提高了查询性能。
对于大型数据集,考虑将子查询结果集的大小降至最低,并使用适当的索引来优化性能。

使用场景:

IN: 当您需要根据多个值进行过滤时,使用IN是很有用的。例如,检查一个值是否在特定列表中。
EXISTS: 当您只需要检查至少存在一个匹配的行时,使用EXISTS是更合适的。

注意事项:

在某些情况下,将大型子查询转换为JOIN操作可能更有效。JOIN操作可以更好地利用索引并减少内存使用。
在设计数据库和查询时,考虑数据的分布和查询模式是很重要的。这有助于选择最合适的操作符和索引策略。

总之,选择IN还是EXISTS应根据具体的数据、表结构、索引和查询需求来决定。在开发过程中进行性能测试和优化是确保最佳性能的关键。

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

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

相关文章

面试题:JVM 调优

一、JVM 参数设置 1. tomcat 的设置 vm 参数 修改 TOMCAT_HOME/bin/catalina.sh 文件,如下图 JAVA_OPTS"-Xms512m -Xmx1024m" 2. springboot 项目 jar 文件启动 通常在linux系统下直接加参数启动springboot项目 nohup java -Xms512m -Xmx1024m -jar…

作业3:计算机体系结构属性优选

作业3:计算机体系结构属性优选 一. 单选题(共11题,55分) (单选题)下列哪个选项属于非线性结构( )? A. 线性表 B. 栈 C. 树 D. 队列 正确答案: C:树; (单选题) 浮点数在机器中的表示形式如下所…

运行sentinel Java环境不是8以及端口被占用如何运行

1.Java环境不是8 运行sentinel (没有耐心直接看第三点) java --add-opens java.base/java.langALL-UNNAMED -jar sentinel-dashboard-1.8.1.jar2.8080端口被使用 运行 sentinel java -jar -Dserver.port8090 sentinel-dashboard-1.8.1.jar3.8080端口占用和Java环境不是8 运行…

JS详解-fetch核心语法

document.querySelector(.btn).addEventListener(click,async () > {const p new URLSearchParams({pname:浙江省,cname:杭州市})//1、如何请求?默认为get,参数1 url地址,返回promiseconst res await fetch(http://hmajax.itheima.net/…

给你一个网站如何测试?

主要围绕,功能,页面 UI ,兼容,性能,安全,这几个方面去聊,首先是制定测试计划,确定测试范围和测试策略,一般包括以下几个部分:功能性测试;界面测试…

【打印SQL执行日志】⭐️Mybatis-Plus通过配置在控制台打印执行日志

目录 前言 一、Mybatis-Plus 开启日志的方式 二、测试 三、日志分析 章末 前言 小伙伴们大家好,相信大家平时在处理问题时都有各自的方式,最常用以及最好用的感觉还是断点调试,但是涉及到操作数据库的执行时,默认的话在控制台…

Comfyui插件CLIPSeg应该如何安装

✨背景 GitHub - biegert/ComfyUI-CLIPSeg: ComfyUI CLIPSeg Comfyui-CLIPSeg是一个相对没那么大众的插件,在基于语义分割和自动抠图方面,还是比较实用的一个插件。但是插件安装起来,跟普通的插件安装有亿点不一样,所以很多小朋友…

pipx和conda

pipx pipx是一个用于安装和运行Python应用的工具,它可以为每个安装的应用创建独立的虚拟环境,从而避免依赖冲突和污染全局环境。以下是一些常见的pipx用法: 安装pipx 首先,确保你已经安装了pipx。如果还没有安装,可…

excel中文本列显示e+17这样的科学计数法如何处理

我的excel中文本列显示e17这样的科学计数法 然后右键,设置单元格格式,为特殊,邮政编码,点确定即可 最后效果如下

全网最强JavaWeb笔记 | 万字长文爆肝JavaWeb开发——day05_SpringBootWeb请求响应

万字长文爆肝黑马程序员2023最新版JavaWeb教程。这套教程打破常规,不再局限于过时的老套JavaWeb技术,而是与时俱进,运用的都是企业中流行的前沿技术。笔者认真跟着这个教程,再一次认真学习一遍JavaWeb教程,温故而知新&…

如何通过ArkTS卡片的Canvas自定义绘制能力实现五子棋游戏卡片

介绍 本示例展示了如何通过ArkTS卡片的Canvas自定义绘制能力实现一个简单的五子棋游戏卡片。 使用Canvas绘制棋盘和黑白棋子的落子。通过卡片支持的点击事件进行交互,让用户在棋盘上进行黑白棋子的对局。通过TS的逻辑代码实现五子棋输赢判定、回退等逻辑计算&…

算法沉淀 —— 动态规划(子序列问题(上))

算法沉淀 —— 动态规划(子序列问题(上)) 前言一、最长递增子序列二、摆动序列三、 最长递增子序列的个数四、最长数对链 前言 几乎所有的动态规划问题大致可分为以下5个步骤,后续所有问题分析都将基于此 1.、状态表示…

BigInteger 大整数 比较大小

一、以整数型礼品交易为例子 int userSend Integer.valueOf(id);int amount Integer.valueOf(amountStr);int userAccept Integer.valueOf(userIdAccept);GiftService giftService new GiftService();boolean carry1 giftService.isHavePropertyByUserIdByGiftId(userSend…

代码随想录算法训练营第43天|1049. 最后一块石头的重量 II |494. 目标和 | 474.一和零

代码随想录算法训练营第43天|1049. 最后一块石头的重量 II |494. 目标和 | 474.一和零 (01背包确实难,但是我是通过 https://www.bilibili.com/video/BV1pY4y1J7na/?spm_id_from333.999.list.card_archive.click&vd_sourcebefaa5fdd7527c53ef9f1b7fccaf9b25 再…

Minikube本地搭建单节点Kubernetes集群

1、什么是 Minikube Minikube 是一个开源工具,旨在为开发者提供一种便捷的方式在本地环境中搭建单节点的 Kubernetes 集群。它主要用于开发、测试和学习 Kubernetes 应用程序,无需依赖大型的硬件资源或复杂的多节点集群配置。minikube 使用轻量级虚拟化技…

蓝桥杯每日一题(快速幂、组合计数)

875 快速幂 快速幂就是将a^k看做是a^2^0和a^2^1……相乘。(相邻两个数是平方关系) 巧妙的是这个时候k就是多个2^n的组合,也就是可以二进制表示。 所以就可以用k的二进制某一位是否为1,判断最后的结果是否乘以a^2^n。 错误点:权值不用初始…

穿透 雪崩 击穿

一、redis的三大缓存问题 正常情况下,大部分的访问请求应该是先被redis响应的,在redis那里得不到响应的小部分访问请 求才会去请求MySQL数据库获取数据,这样MySQL数据库的负载压力是非常小的,且可以正常工 作 缓存雪崩/穿透/击…

Linux中的conntrack命令深入解析

在Linux网络管理和监控领域,conntrack命令是一个强大的工具,它提供了对netfilter连接跟踪系统的直接访问🔍。这篇文章将深入探讨conntrack的由来、底层原理、参数意义,以及其常见用法,并对返回结果的每个字段进行详细解…

C/C++程序的(编译,链接)翻译与运行

目录 前言: 1.程序环境 2.翻译环境 3.预处理(预编译) 4.编译 5.汇编 6.链接 7.运行环境 总结: 前言: 本篇来解释c/c程序的翻译环境与运行环境中的过程,不同的编程语言的翻译环境类似,…

Transformers in Vision:A Survey 阅读笔记

ACM上的一篇综述,讨论Transformer在CV上的应用。 摘要: Among their salient benefits,Transformers enable modeling long dependencies between inputsequence elements and support parallel processing of sequence as compared to recurrent networ…