zoukankan      html  css  js  c++  java
  • sql exist和in的区别及查询效率比较

    如说两张表一张是用户表TDefUser(userid,address,phone),一张是消费表TAccConsume(userid,time,amount),我要查消费超过5000的用户记录,那么我可以写 

    Java代码  
    select   *   from   TDefUser where   exists   (select   1   from   TAccConsume   where   TDefUser.userid=TAccConsume.userid   and   TAccConsume.amount> 5000)  
    也可以写 
    Java代码  
    select   *   from   TDefUser where   userid   in   (select   userid   from   TAccConsume   where   TAccConsume.amount> 5000)   
     
    select   1   代表什么意思呢? 
    ============== 
    师傅说因为exists只返回真或假,select   1   可以提高效率。 
     
    exists()后面的子查询被称做相关子查询   他是不返回列表的值的.只是返回一个ture或false的结果(这也是为什么子查询里是 "select   1 "的原因   当然也可以select任何东西) 
    其运行方式是先运行主查询一次   再去子查询里查询与其对应的结果   如果是ture则输出,反之则不输出.再根据主查询中的每一行去子查询里去查询. 
     
    in()后面的子查询   是返回结果集的,换句话说执行次序和exists()不一样.子查询先产生结果集,然后主查询再去结果集里去找符合要求的字段列表去.符合要求的输出,反之则不输出. 
     
    可是我不太知道exists的执行过程是怎么样的 
    ------------------------------------------ 
    执行顺序如下: 
    1.首先执行一次外部查询 
    2.对于外部查询中的每一行分别执行一次子查询,而且每次执行子查询时都会引用外部查询中当前行的值。 
    3.使用子查询的结果来确定外部查询的结果集。 
    如果外部查询返回100行,SQL   就将执行101次查询,一次执行外部查询,然后为外部查询返回的每一行执行一次子查询。但实际上,SQL的查询 
    优化器有可能会找到一种更好的方法来执行相关子查询,而不需要实际执行101次查询。
     
    有人说:能用左连接做掉的事情,尽量不要去用exists,in之类的 
     
    又有人说:exists的性能比外连接更好,曾用过做数十万数据量的查询,exists大概比外连接快30%左右 
     
    还有人说:如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in;反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists
    web开发网http://www.software8.co/wzjs/mysql/2077.html
  • 相关阅读:
    《从0开始学架构》——学习笔记(基础篇和高性能篇)
    Oracle的数据并发与一致性详解(下)
    Oracle的数据并发与一致性详解(上)
    关于oracle的缓冲区机制与HDFS中的edit logs的某些关联性的思考
    分布式锁的两种实现方式(基于redis和基于zookeeper)
    hadoop配置文件详解系列(二)-hdfs-site.xml篇
    hadoop配置文件详解系列(一)-core-site.xml篇
    【管理心得之四十六】你呀,少肺
    【管理心得之四十五】你呀,没心
    【管理心得之四十四】独立冲突之外,你做不到
  • 原文地址:https://www.cnblogs.com/wwwroot/p/2833999.html
Copyright © 2011-2022 走看看