
exists和in的效率区别(数据库中IN和EXISTS有什么区别)
- 科技
- 2023-08-14
- 4

大家好,今天来为大家分享exists和in的效率区别的一些知识点,和数据库中IN和EXISTS有什么区别的问题解析,大家要是都明白,那么可以忽略,如果不太清楚的话可以看...
大家好,今天来为大家分享exists和in的效率区别的一些知识点,和数据库中IN和EXISTS有什么区别的问题解析,大家要是都明白,那么可以忽略,如果不太清楚的话可以看看本篇文章,相信很大概率可以解决您的问题,接下来我们就一起来看看吧!
如何在mysql中查询当前数据上一条和下一条的记录
我来讲一下这个问题吧:
题主说的查询应该是这样吧:select*fromawhereidin(selectidfromb);对于这条sql语句它的执行计划其实并不是先查询出b表的所有id,然后再与a表的id进行比较。mysql会把in子查询转换成exists相关子查询,所以它实际等同于这条sql语句:select*fromawhereexists(select*frombwhereb.id=a.id);
而exists相关子查询的执行原理是:循环取出a表的每一条记录与b表进行比较,比较的条件是a.id=b.id.看a表的每条记录的id是否在b表存在,如果存在就行返回a表的这条记录。
exists查询有什么弊端?由exists执行原理可知,a表(外表)使用不了索引,必须全表扫描,因为是拿a表的数据到b表查。而且必须得使用a表的数据到b表中查(外表到里表中),顺序是固定死的。
如何优化?建索引。但是由上面分析可知,要建索引只能在b表的id字段建,不能在a表的id上,mysql利用不上。
这样优化够了吗?还差一些。由于exists查询它的执行计划只能拿着a表的数据到b表查(外表到里表中),虽然可以在b表的id字段建索引来提高查询效率。但是并不能反过来拿着b表的数据到a表查,exists子查询的查询顺序是固定死的。
为什么要反过来?因为首先可以肯定的是反过来的结果也是一样的。这样就又引出了一个更细致的疑问:在双方两个表的id字段上都建有索引时,到底是a表查b表的效率高,还是b表查a表的效率高?
该如何进一步优化?把查询修改成innerjoin连接查询:select*fromainnerjoinbona.id=b.id;(但是仅此还不够,接着往下看)
为什么不用leftjoin和rightjoin?这时候表之间的连接的顺序就被固定住了,
比如左连接就是必须先查左表全表扫描,然后一条一条的到另外表去查询,右连接同理。仍然不是最好的选择。
为什么使用innerjoin就可以?innerjoin中的两张表,如:ainnerjoinb,但实际执行的顺序是跟写法的顺序没有半毛钱关系的,最终执行也可能会是b连接a,顺序不是固定死的。如果on条件字段有索引的情况下,同样可以使用上索引。
那我们又怎么能知道a和b什么样的执行顺序效率更高?答:你不知道,我也不知道。谁知道?mysql自己知道。让mysql自己去判断(查询优化器)。具体表的连接顺序和使用索引情况,mysql查询优化器会对每种情况做出成本评估,最终选择最优的那个做为执行计划。
在innerjoin的连接中,mysql会自己评估使用a表查b表的效率高还是b表查a表高,如果两个表都建有索引的情况下,mysql同样会评估使用a表条件字段上的索引效率高还是b表的。
而我们要做的就是:把两个表的连接条件的两个字段都各自建立上索引,然后explain一下,查看执行计划,看mysql到底利用了哪个索引,最后再把没有使用索引的表的字段索引给去掉就行了。
数据库中IN和EXISTS有什么区别
没有什么区别,两者都是包含的意思,但是esists的效率比in要高。建议别用in,影响效率,如果只有两三个条件,就用or代替,如果值比较多,就用exists.例如select*fromtablewhere(name='1'orname='2')别写成namein('1','2')如果数据量比较大select*fromtablewherenameexists(selectnamefromtable2);
好了,本文到此结束,如果可以帮助到大家,还望关注本站哦!
本文链接:http://www.depponpd.com/ke/3096.html