zoukankan      html  css  js  c++  java
  • 面试被问之-----sql优化中in与exists的区别

    曾经一次去面试,被问及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

     

  • 相关阅读:
    第四次作业
    第二次上机作业
    5.21上机作业
    第十一周课后作业
    第十一周上机练习
    第10周java作业
    第9次上级联系
    第8周作业
    第八周上机练习
    第七周作业
  • 原文地址:https://www.cnblogs.com/goujh/p/10092405.html
Copyright © 2011-2022 走看看