实习工作中Sql 语句中 IN 和 EXISTS 的心得体会

在学校时做项目时数据库表少而且数据量也不大,做子查询的时候一般没有什么区别,所以一直以来没有注意过这个问题。

如今工作后,让我实现政府执法人员执政编号的修改,用IN做子查询时发现效率特别慢,最后发现是因为IN语句中查询顺序不同导致的。

IN 语句:只执行一次

    确定给定的值是否与子查询或列表中的值相匹配。IN在查询的时候,首先查询子查询的表,然后将内表和外表做一个笛卡尔积,然后按照条件进行筛选。所以相对内表比较小的时候,IN的速度较快。

尤其是当我用市级证件表与市级制证表关联的时候,子查询中市级制证表中数据庞大 ,查询效率低,这时我想到还有EXISTS语句

之前对它两的区别不是特别清楚,经过查询后得出这正是我现在需要的。

EXISTS语句:执行外表.length次

指定一个子查询,检测行的存在。遍历循环外表,然后看外表中的记录有没有和内表的数据一样的。匹配上就将结果放入结果集中。

实习工作中遇到一些问题,不仅巩固了我之前知识的不足,而且为以后遇到各种各样的问题提供了经验。

以下是转载内容:

区别及应用场景
    in 和 exists的区别: 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in, 反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了 ,另外IN时不对NULL进行处理。

    in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。一直以来认为exists比in效率高的说法是不准确的。

not in 和not exists
    如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。
--------------------- 
作者:wqc19920906 
来源:CSDN 
原文:https://blog.csdn.net/wqc19920906/article/details/79800374 
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/weixin_40333410/article/details/84982905
今日推荐