首页 > 数据库技术 > 详细

面试被问之-----sql优化中in与exists的区别

时间:2018-12-09 19:34:59      阅读:213      评论:0      收藏:0      [点我收藏+]

曾经一次去面试,被问及in与exists的区别,记得当时是这么回答的:‘‘in后面接子查询或者(xx,xx,xx,,,),exists后面需要一个true或者false的结果",当然这么说也不算错,但别人想听的是sql优化相关,肯定是效率的问题,只是那个时候确实不知道它们在sql优化上的区别,只知道用in会进行全表查询,exists不会全表查询,然后,我就灰溜溜的回来了!

今天就来彻底搞清楚它们的区别,查询了众多网上资料如下:

转: Mysql中 in or exists not exists not in区别 (网络整理)

转: Sql语句中IN和exists的区别及应用

总结起来大概是这样的:

in是先进行子查询,然后将内表(子查询)与外表(主查询)进行hash关联(笛卡尔积),然后进行条件比较,即筛选in前后字段相等的数据保留,不相等的删除.

exists是先进行外层表loop循环,然后将每一条数据当做条件进行子查询,如果子查询返回true则保存该数据,否则删除.

可以理解为用in时先子表全表查询,然后将每一条数据作为条件以及索引拿去进行主表查询,所以如果主表大于子表,那么用in就会效率高,

而用exists会先进行主表全表查询,然后将每一条数据作为条件以及索引拿去进行子表查询,,所以如果主表小于子表,那么用exists会效率高.

因为索引在数据多的时候才真正派上用场了.

 

not in主表和子表都不会用到索引且子表有null值时,查询结果有问题,

而not exists子表始终会用到索引,而且不会存在子表有null值时的问题

转: [笔记] SQL性能优化 - 避免使用 IN 和 NOT IN

所以,用not exists替代not in

 

面试被问之-----sql优化中in与exists的区别

原文:https://www.cnblogs.com/goujh/p/10092405.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!