• in notin exists not exists 性能优化算法总结


    in notin exists not exists 性能优化算法总结

    • 1.1. in 和 exists 区别
    • 1.2. not in 能不能走索引
    • 1.3. not in 和 join 的关系
    • 1.4. 和 not Exists 的关系
    • 1.5. in 的实现过程

    1.1. in 和 exists 区别

    in 和exists 的区别是in 和exists 执行时,in 是先执行子查询中的查询,然后再执行主查询。而exists查询它是先执行主查询,即外层表的查询,然后再执行子查询。

    exists 和 in 在执行时效率单从执行时间来说差不多,exists要稍微优于in。在使用时一般应该是用exists 而不用in。

    如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in, 反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。

    IN 不对NULL进行处理。

    1.2. not in 能不能走索引

    答案是有些可以有些不可以。

    排除少量情况下 ,not in 基本就是等同遍历了。

    如果排除上万数据,那走走索引还是有用的,排除的数据越多,走索引效果越好。具体的实现实现效果和数据库类型和版本相关。一般越高级数据库与版本会对此优化越好。。

    如果遇到相关数据库对此语句优化不好,那就需要利用适当调整sql语句,换个等义的更高性能写法(一般可读性会因此下降) 或者利用存储过程自定义函数等自己实现性能高的notin算法,或者用编程语言实现

    1.3. not in 和join 的关系

    虽然not in 里面排除多的情况下可以走索引,但数据库具体实现可能没有实现,此时可以使用join 代替代价就是可读性相对会下降写。

    优先使用not in,其次join 代替 可读性优先保证

    1.4. 和 not Exists 的关系

    含义上说 notin 基本就是notexist 也有可能是sql标准,待确定有可能不同的数据库

    区分是为了实现俩种不同的查询算法 有些数据库俩种算法几乎一样效率,有些数据库实现的不一样。。

    而且数据量大小不同的情况下,可能会走不同的路径,不能一概而论。。

    1.5. in 的实现过程

    用in 写出来的SQL 的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格。但是用in 的SQL 性能总是比较低的

    从SQL执行的步骤来分析用IN的SQL与不用IN的SQL有以下区别:SQL试图将其转换成多个表的连接,如果转换不成功则先执行IN里面的子查询,再查询外层的表记录,如果转换成功则直接采用多个表的连接方式查询。

    可见用IN的SQL至少多了一个转换的过程。一般的SQL都可以转换成功

  • 相关阅读:
    mysql备份还原
    java-mysql(3) 读写image
    java-mysql(2) Prepared statement
    java-mysql(1)
    jmeter报告分析工具
    浏览器下载img标签Base64图片
    Java定时器TimeTask
    js倒计时
    h5语音播放(移动端)
    Linux环境下在Tomcat上部署JavaWeb工程
  • 原文地址:https://www.cnblogs.com/yizhiamumu/p/16641326.html
Copyright © 2020-2023  润新知