zoukankan      html  css  js  c++  java
  • 关于in与exists的效率讨论

    关于in与exists的效率讨论
    1)、select * from A where id in (select id from B)
    以上查询使用了in语句,in只执行一次,他查出B表的所有id字段并缓存起来。之后,
    检查A表的id是否与B表中的id相等,如果相等,则将A表的记录加入结果集中,直到遍历完A表的所有记录。

    由此可知,当B表数据较大时,不适合使用in,因为它会将B表数据全部遍历一次。
    如:A表有1000条记录,B表有10000000条记录,那么最多有可能遍历1000*10000000次,效率差。
    如:A表有1000条记录,B表有100条记录,那么最多有可能遍历1000*100次,遍历次数大大减少,效率大大提升。
    结论:in适合B表A表数据小的情况。

    2)、select a.* from A a where exists(select 1 from B b where a.id = b.id)
    以上查询使用了exists语句,exists会执行A.length次,它并不缓存exists结果集,因为结果集的内容并不重要,重要的
    是结果集中是否有记录,如果有则返回true,没有则返回false。

    由此可知,B表比A表数据大时,适合使用exists,因为它没有那么多的遍历操作,只需要再执行一次查询就行。
    如:A表有10000条记录,B表有1000000条记录,那么exists会执行10000次去判断A表中的id是否与B表中的id相等。
    如:A表有10000条记录,B表有100000000条记录,那么exists会执行1000此,因为它只执行A.length次,
    可见B表数据越多,越适合exists发挥效果。
    如:A表有10000条记录,B表有100条记录,那么exists还是执行10000次,还不如使用in遍历10000*100次,因为in是在内存里
    遍历比较,而exists需要查询数据库,大家都知道查询数据库所消耗的性能更高,而内存比较块。
    结论:exists适合B表比A表数据大的情况。

    当A表数据与B表数据一样大时,in与exists效率差不多,可任选一个使用。

    备注:可能有点小争议,若有独到的见解,大家可以交流一下。

    没有绝对的正确,只有相对的正确。

  • 相关阅读:
    [原创]用C++类实现单向链表的增删查和反转操作
    [原创]c语言中const与指针的用法
    [原创]大连sap vt 实习生面试经历
    Android studio 相关错误处理
    Java 判断整数方法
    Android 网络编程
    Android 基础篇(二)
    Android ListView 的基本应用,包括缓存
    Java重点识记
    Android基础篇(一)
  • 原文地址:https://www.cnblogs.com/xiaoxian1369/p/4047419.html
Copyright © 2011-2022 走看看