• 关于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效率差不多,可任选一个使用。

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

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

  • 相关阅读:
    The hardest problem ever
    1146 Topological Order
    1147 Heaps
    Weekly Contest 184
    1148 Werewolf
    1149 Dangerous Goods Packaging
    1150 Travelling Salesman Problem
    1151 LCA in a Binary Tree (30point(s))
    1152 Google Recruitment
    美团2020春招笔试
  • 原文地址:https://www.cnblogs.com/xiaoxian1369/p/4047419.html
Copyright © 2020-2023  润新知