MySQL优化篇:IN VS EXISTS
1、优化原则:小表驱动大表,即小的数据集驱动大的数据集
select * from A where id in (select id from B)
以上SQL语句等价于:
for select id from B
for select * from A where A.id=B.id
当B表的数据集必须小于A表的数据集时,用IN优于EXISTS
select * from A where exists (select 1 from B where B.id=A.id)
以上SQL语句等价于:
for select * from A
for select * from B where B.id=A.id
当A表的数据集必须小于B表的数据集时,用EXISTS优于IN。
注意:A表与B表的ID字段应建立索引
2、EXISTS
语法如下
SELECT ……FROM table WHERE EXISTS (subquery)
该语法可以理解为:将主查询中的数据,放到子查询中做条件验证,根据验证结果(TRUE或FALSE)来决定主查询的数据结果是否得以保留。
提示
- EXISTS (subquery)只返回TRUE或FALSE,因此子查询中的SELECT * 也可以是SELECT 1 或SELECT ‘X’,官方说法是实际执行时会忽略SELECT清单,因此没有区别
- EXISTS子查询的实际执行过程可能经过了优化而不是我们理解上的逐条对比,如果担心效率问题,可以进行实际校验以确定时候有效率问题
- EXISTS子查询往往可以用条件表达式、其他子查询或者JOIN来代替,何种最优需要具体问题具体分析
总结
- IN:只执行一次;EXISTS:执行A.length次;
- IN:确定给定的值是否与子查询或列表中的值相匹配。in在查询的时候,首先查询子查询的表,然后将内表和外表做一个笛卡尔积,然后按照条件进行筛选。所以相对内表比较小的时候,in的速度较快;
- EXISTS:指定一个子查询,检测行的存在。遍历循环外表,然后看外表中的记录有没有和内表的数据一样的。匹配上就将结果放入结果集中;
- in 和 exists的区别: 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in, 反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了 ,另外IN时不对NULL进行处理;
- IN 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询
MySQL优化篇:IN VS EXISTS相关推荐
- 深入浅出Mysql - 优化篇(锁)
深入浅出Mysql - 优化篇(锁) 锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的资源.如何保 ...
- MySQL优化篇:锁机制
文章目录 1.概述 1.1 定义 1.2 分类 2.表锁(偏向于读操作) 2.1 特点 2.2 案例分析 2.3 案例结论 2.4 表锁分析 3.行锁(偏向于写操作) 3.1 特点 3.2 案例分析 ...
- MySQL优化篇:数据准备
文章目录 1.建表语句 2.设置参数 3.编写随机函数 3.1 随机产生字符串 3.2 随机产生部门编号 4.创建存储过程 4.1 创建往emp表中插入数据的存储过程 4.2 创建往dept表中插入数 ...
- MySQL优化篇:排序分组优化
文章目录 1.order by关键字排序优化 1.1 无过滤不索引 1.2 顺序错,必排序 1.3 方向反,必排序 1.4 索引的选择 1.5 using filesort 1.6 使用覆盖索引 1. ...
- MySQL优化篇:慢查询日志
1.概念 MySQL的慢查询日志是MySQL提供的一种日志记录,他用来记录在MySQL中响应时间超过阈值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中. ...
- MySQL优化篇:SQL优化流程
MySQL中SQL优化流程 SQL优化流程如下: 慢查询的开启并捕获 explain+慢SQL分析 show profile查询SQL在MySQL服务器里面的执行细节和生命周期情况 SQL数据库服务器 ...
- MySQL优化篇:show profile进行SQL分析
文章目录 1.SQL分析.调优和排查的大体流程 2.show profile是什么 3.show profile分析步骤 (1)是否支持,看看当前的MySQL版本是否支持 (2)开启功能,默认是关闭, ...
- MySQL优化篇:单表索引失效
文章目录 1.准备环境 2.全值匹配我最爱 2.最佳作前缀法则 3.不要在索引列上做任何计算 3.1 在查询列上使用了函数 3.2 在查询列上做了转换 4.索引列上不能有范围查询 5.尽量使用覆盖索引 ...
- MySQL优化篇:索引
文章目录 1.概念 1.1 是什么 1.2 优缺点 2.MySQL的索引 2.1 Btree索引 2.2 B+Tree索引 3.MySQL索引分类 3.1 单值索引(普通索引) 3.2 唯一索引 3. ...
最新文章
- jmeter用户自定义变量的实际使用
- Java学习之动态代理
- AIoT让一个屏有了100种用法
- 基于Accord.Audio和百度语言识别
- 牛客题霸 [反转字符串] C++题解/答案
- java hibernate 表关联_Hibernate多表关联
- 手机游戏产品经理(七)创建本地化产品的意见
- spark MapPartitionsRDD及ShuffleRDD
- win10备份为wim_经典好用系统安装备份工具一键恢复CGI-plus v5.0.0.4 增强版
- Cadence每日一学_01| Cadence、Allegro、OrCAD都是什么东东?
- 混淆 php,开发简单的PHP混淆器与解混淆器
- bzoj3332 旧试题 [最大生成树]
- Sunshine 项目构思
- 虚拟机无法查询ip地址的解决方案
- c语言中以只读方式打开,C 中如何以只读方式打开文件
- windows10下用PowerShell命令(Get-FileHash)校验文件的Hash值(MD5、SHA1、SHA256等)
- Unity--内置转换矩阵
- pandas读取csv写入mysql_使用python的pandas库读取csv文件保存至mysql数据库
- win10——戴尔笔记本电脑插上耳机没有声音电脑外放
- 中国烟酰胺单核苷酸(NMN)行业研究与投资预测报告(2022版)
热门文章
- 8道Python基础面试练习题
- C语言单链成绩表,【查找链表面试题】面试问题:C语言基于单链… - 看准网
- java拍照搜题软件下载_拍照即可秒出答案,搜题类App:是教辅“神器”还是偷懒“神器”?...
- 教你在 Kubuntu 21.10 中升级 KDE Plasma 5.24
- 如何使用htmlq提取html文件内容
- 从linux小白到进大厂,我是怎么做到的?
- Linux之Vim文本代码编辑神器应用get技巧
- HDU2199(二分算法)
- Dungeon Master(bfs)广度优先搜索
- 和csm_假面骑士ooo十周年纪念向csm周边 核心硬币和收纳盒再版