zoukankan      html  css  js  c++  java
  • MySQL-IN和Exists区别

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

      exists()后面的子查询被称做相关子查询,它和in查询不同,in()后面的子查询 是返回结果集的;而exists是不返回列表的值的,只是返回一个ture或false,也就是说exists判断子查询的结果是不是存在,但并不关心查到的是什么结果,是什么字段(这也是为什么子查询里经常会有"select 1"或select数字的原因);

      其实我们区分in和exists,还有一种理解就是通过驱动顺序,如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了;

    exists执行顺序:

    • 首先执行一下外部查询;
    • 对于外部查询的每一行分别执行一次子查询,返回一个逻辑值true或者false;
    • 根据子查询返回的逻辑结果来确定主查询的结果集;

      如果两个表中一个是小表,一个是大表,则子查询表大的用exists,子查询表小的用in效率高点:
    例如:表A(小表),表B(大表)

    (1). select * from A where cc in (select cc from B)
    -- 效率低,用到了A表上cc列的索引;
    (2). select * from A where exists(select cc from B where cc=A.cc)
    -- 效率高,用到了B表上cc列的索引。
    
    -- 相反的
    (3). select * from B where cc in (select cc from A)
    -- 效率高,用到了B表上cc列的索引;
    (4). select * from B where exists(select cc from A where cc=B.cc)
    -- 效率低,用到了A表上cc列的索引。

    2. not in 和not exists
    如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not exists 的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。

    3. 如果查询的两个表大小相当,那么用in和exists差别不大。

    4. 总结:IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况

    参考:http://bbs.csdn.net/topics/310148714

    http://bbs.csdn.net/topics/350022037?list=lz

  • 相关阅读:
    教你取得计算机的所有权(可删除和打开或复制系统文件)
    为什么人口红利不能解决中国危机?
    开发者需要知道的11条HTML5小常识
    高性能CSS(四)
    8个应该去逛逛JQuery的学习网站
    用PHP调用证件识别接口识别本地图片
    Android开发有用的三方网站
    手机话费充值和手机流量充值 API
    Android开发之短信验证码示例
    微信小程序(应用号)开发新闻客户端的实战课程
  • 原文地址:https://www.cnblogs.com/xiaozhang2014/p/7859225.html
Copyright © 2011-2022 走看看