mysql中exists 和 in的用法你还真不知道
exists与in的查询方式
In:是把外表和内表做Hash 连接
,
exists:是对外表作loop 循环,每次loop循环再对内表进行查询
典型的连接类型共有3种:
排序- 合并连接(Sort Merge Join (SMJ) )
嵌套循环(Nested Loops (NL) )
哈希连接(Hash Join)
效率分析
比如:
A表(主查询,即:外表)和B表(子查询,即:内表)关联查询;
当A表和B表大小相当时,用in和exists查询效率差不多;
当A表(主查询)比B表(子查询)大的时,即子查询表小的时候用In效率高;
当A表(主查询)比B表(子查询)小的时,即子查询表大的时候用exists效率高;
格式不同
1、In:
select a.* from A where a.id in (select b.id from B b)
2、exists:
select a.* from A where exists (select b.id from B b where a.id=b.id)
例如 :
表A(主查询)大,B表(子查询)小
in 查看:
select a.* from A where a.id in (select bid from B b)相当于:select * from A a, (select b.id from B b) c where a.id = c.id
效率低的原因
全程扫描B表,用到A 表上的a.id的索引,因为A表大
exists 查看
select * from a where exists (select b.id from B b where b.id = a.id)
效率高的原因:
全程扫描A表,用到B表上的b.id的索引,因为B表大
Not in 和Not Exists 的 效率
格式不同:
In:
select a.* from A where a.id not in (select b.id from B b)
exists:
select a.* from A where not exists (select b.id from B b where a.id=b.id)
如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts 的子查询依然能用到表上的索引。 所以无论那个表大,用not exists都比not in要快。
关联子查询与非关联子查询
关联子查询需要在内部引用外部表,而非关联子查询不要引用外部表。对于父查询中处理的记录来说,一个关联子查询是每行计算一次,然而一个非关联子查询只会执行一次,而且结果集被保存在内存中(如果结果集比较小),或者放在一张oracle临时数据段中(如果结果集比较大)。一个“标量”子查询是一个非关联子查询,返回唯一记录。如果子查询仅仅返回一个记录,那么oracle优化器会将结果缩减为一个常量,而且这个子查询只会执行一次。
如何选择?
根据外部查询,以及子查询本身所返回的记录的数目。如果两种查询返回的结果是相同的,哪一个效率更好?
关联子查询的系统开销:对于返回到外层查询的记录来说,子查询会每次执行一次。因此,必须保证任何可能的时候子查询都要使用索引。
非关联子查询的系统开销:子查询只会执行一次,而且结果集通常是排好序的,并保存在临时数据段中,其中每一个记录在返回时都会被父级查询引用,在子查询返回大量记录的情况下,将这些结果集排序回增大系统的开销。
所以:如果父查询只返回较少的记录,那么再次执行子查询的开销不会非常大,如果返回很多数据行,那么直查询就会执行很多次。 如果子查询返回较少的记录,那么为内存中保存父查询的结果集的系统开销不会非常大,如果子查询返回多行,那么需要将结果放在临时段上,然后对数据段排序,以便为负查询中的每个记录服务。
mysql中exists 和 in的用法你还真不知道相关推荐
- mysql中有exist吗_关于MySQL 中 EXISTS 的用法
需求: 在MySQL中 EXISTS 和 IN 的用法有什么关系和区别呢? 假定数据库中有两个表 分别为 表 a 和表 b: create tablea ( a_idint, a_namevarcha ...
- mysql中exists用法
在MySQL中 EXISTS 和 IN 的用法有什么关系和区别呢? 假定数据库中有两个表 分别为 表 a 和表 b create table a ( a_id int, a_name varchar( ...
- MySQL中EXISTS的用法
比如在Northwind数据库中有一个查询为 SELECT c.CustomerId,CompanyName FROM Customers c WHERE EXISTS( SELECT OrderID ...
- Mysql中rank类的函数用法
Mysql中rank类的函数用法 rank() over 作用:查出指定条件后的进行排名,条件相同排名相同,排名间断不连续. 说明:例如学生排名,使用这个函数,成绩相同的两名是并列,下一位同学空出所占 ...
- MySQL数据库,从入门到精通:第四篇——MySQL中常用的运算符及其用法
MySQl学习(MySQL数据库,从入门到精通:第四篇--MySQL中常用的运算符及其用法 第四篇_MySQL中常用的运算符及其用法运算符 1. 算术运算符 1.加法与减法运算符 2.乘法与除法运算符 ...
- MySQL中ALL 和 ANY的用法
"历览前贤国与家,成由勤俭破由奢" 序 今天看书得到MySQL中ALL和ANY的用法,在此之前甚至都不知道MySQL还有这两个运算符. 现在数据表如下,分别是姓名.薪水.部门ID: ...
- MySQL中exists与in的使用
exists对外表用loop逐条查询,每次查询都会查看exists的条件语句,当 exists里的条件语句能够返回记录行时(无论记录行是的多少,只要能返回),条件就为真,返回当前loop到的这条记录, ...
- MySQL中索引与视图的用法与区别详解
索引与视图是我们在日常使用mysql必不可少的一部分,最近在学习中看到一本书中关于这方法写的不错,所以这篇文章主要给大家介绍了关于MySQL中索引与视图的使用与区别的相关资料,需要的朋友可以参考借鉴, ...
- 浅析MySQL中exists,in ,=的使用
exists对外表用loop逐条查询,每次查询都会查看exists的条件语句,当 exists里的条件语句能够返回记录行时(无论记录行是的多少,只要能返回),条件就为真,返回当前loop到的这条记录, ...
- 5、MySql中exists 和in的效率比较
先下结论: 如果查询的两个表大小相当,那么用in和exists差别不大 如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in: 所以无论那个表大,用not exists都 ...
最新文章
- linux的cat命令
- PCL点云库学习(1):环境配置(Ubuntu16.04+QT5+VTK8.0)
- oracle表格颜色,如何在oracle中使用光标更新特定颜色
- 腾讯3轮面试都问了Android事件分发,原理+实战+视频+源码
- 团队项目第二次冲刺(4)
- python魔法方法(一)
- 凸优化第四章凸优化问题 4.6 广义不等式约束
- 创新者的窘境 Teh Innovator‘s Dilemma
- linux 查看网口实时流速_Linux查看实时带宽流量情况
- BMZCTF misc1
- Mybatis(狂神老师上课笔记)
- 承上启下继往开来,Python3上下文管理器(ContextManagers)与With关键字的迷思
- 互联网域名管理办法发布 域名注册必须实名
- html的abbr标签,html中如何使用abbr标签
- Alien Skin Exposure X5 Bundle Mac(PS/LR照片胶片滤镜插件)
- DUTOJ1205(大数)
- VC++操作Excel生成饼状图!
- FinalShell密码找回/FinalShell密码破解
- PotPlayer 和 VLC 播放器的书签
- 高手帮忙啊!关于插入数据库的问题!急急!菜鸟提问!