查询优化CASE与UNION

时间:2011-10-21 07:05:30

标签: mysql optimization

此查询从friendlist表返回用户朋友的记录,然后从用户表中获取每个用户的记录。

选项#1

SELECT 
  f.status,
  f.user_to_id,
  f.user_from_id,
  u.user_id,
  u.registration_date,
  u.nickname,
  u.email
FROM ti_friend_list AS f
     LEFT JOIN ti_user u
        ON u.user_id = (CASE f.user_from_id 
                        WHEN 7 THEN f.user_to_id 
                        ELSE f.user_from_id END)
WHERE (f.user_from_id = 7
       OR f.user_to_id = 7) 

选项#2

SELECT 
  f.status,
  f.user_to_id,
  f.user_from_id,
  u.user_id,
  u.registration_date,
  u.nickname,
  u.email
FROM ti_friend_list AS f
  LEFT JOIN ti_user u
    ON u.user_id = f.user_to_id
WHERE f.user_from_id = 7
UNION ALL
SELECT 
  f.status,
  f.user_to_id,
  f.user_from_id,
  u.user_id,
  u.registration_date,
  u.nickname,
  u.email
FROM ti_friend_list AS f
  LEFT JOIN ti_user u
    ON u.user_id = f.user_from_id
WHERE f.user_to_id = 7

哪一个是更优化的解决方案。基本上是CASE和UNION之间的比较

2 个答案:

答案 0 :(得分:1)

同时运行它们,看看是否有时差!

除此之外,我建议使用CASE方法在未来的意图和易于扩展方面更清晰,除非您找到明确的证据,否则我会使用它。我认为它会更快。

答案 1 :(得分:0)

我想像Brian一样:

  • 我认为引擎更难以优化UNION,因为你可以统一非常不同的东西!
  • UNION的问题在于您必须重复查询的SELECT部分​​并且不要犯错误
  • 引擎将执行联合的第一部分,然后执行第二部分然后合并。我认为有些步骤会完成两次。

您可以在查询中尝试“解释”命令,以查看引擎正在使用的计划。