【问题标题】:Queries run fast separately, slowly under UNION查询分别跑快,UNION下慢
【发布时间】:2011-04-28 20:44:05
【问题描述】:

我有一个查询需要几分钟才能运行。我想我可以让它在四个单独的查询中运行得更快,然后是UNION。我至少对四个单独的查询部分是正确的。它们运行,从最慢到最快,~7 秒,~1 秒,

所以我认为所有这些中的UNION 会以最慢的速度运行,大约为 7 + 1 + 1 + 1 = 10 秒。但是,当我运行这个 UNION 查询时,它需要 100 多秒。

(select id from view_macatawa_prospect_match_first_and_last_name)
union
(select id from view_macatawa_prospect_match_full_name)
union
(select id from view_macatawa_prospect_match_just_address)
union 
(select id from view_macatawa_prospect_match_name_and_address)

为什么UNION 会让这些都变慢?在我看来,MySQL 所要做的就是执行四个查询,然后连接结果。

编辑:我想我没有问我真正追求的是什么:一种让这个查询快速运行的方法。

【问题讨论】:

    标签: mysql


    【解决方案1】:

    问题在于union 删除了重复项。所以这不仅仅是运行查询。

    尝试使用union all 而不是union

    这样,重复的就不会被删除:

    (select id from view_macatawa_prospect_match_first_and_last_name)
    union all
    (select id from view_macatawa_prospect_match_full_name)
    union all
    (select id from view_macatawa_prospect_match_just_address)
    union all
    (select id from view_macatawa_prospect_match_name_and_address)
    

    使用union all,您应该得到更接近单独运行查询时所获得的时间。

    【讨论】:

    • 使用UNION ALL 仍然很慢。
    【解决方案2】:

    改用“UNION ALL”

    UNION 尝试隐式应用“DISTINCT”,这意味着您的结果不会有任何重复,因此速度会变慢。如果你不想要隐含的 DISTINCT,你可以使用 UNION ALL。

    【讨论】:

      猜你喜欢
      • 2011-04-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-03
      • 1970-01-01
      相关资源
      最近更新 更多