6

我有一张桌子说它table1有 3 列column1, column2 and column3

和是一个column1与其他 2 个表。但是,其中的数据来自 n 个表。column2FOREIGN KEYcolumn3

例如,让我们考虑 Facebook。为了显示活动,它可能会维护一个表,该表可能具有user1 photoliked photo1user1 statusliked status1。所以在这种情况下column3不能是FOREIGN KEY带有特定表的。

现在有两种获取真实数据的方法 -

第一种方式——

SELECT user_id,
       verb_id,
       CASE WHEN verb_id = photoliked THEN
            (SELECT photo_name FROM photos WHERE photo_id = column3) -- getting the desired data from the third column
         WHEN verb_id = statusliked THEN
            (SELECT status FROM statustable WHERE status_id = column3) 
         ELSE '' END AS performedon
FROM table1
     JOIN table2 ON user_id = user_id  -- joining the first column
     JOIN table3 ON verb_id = verb_id  -- joining the second column

第二种方式——

SELECT user_id,
       verb_id,
       CASE WHEN verb_id = photoliked THEN
            p.photo_name
         WHEN verb_id = statusliked THEN
            s.status
         ELSE '' END AS performedon
FROM table1
     JOIN table2 ON user_id = user_id  -- joining the first column
     JOIN table3 ON verb_id = verb_id  -- joining the second column
     LEFT JOIN photos p ON p.photo_id = column3  -- joining the column3 with specific table 
     LEFT JOIN statustable s ON s.status_id = column3

问题

两种方法中哪一种更好地检索数据?两个查询中哪一个更便宜?

4

3 回答 3

1

我认为JOIN会更快,因为它对查询执行一次,而且我会尝试verb_id过滤JOIN

SELECT user_id,
   verb_id,
   COALESCE(p.photo_name, s.status) AS performedon
FROM table1
    JOIN table2 ON user_id = user_id  -- joining the first column
    JOIN table3 ON verb_id = verb_id  -- joining the second column
    LEFT JOIN photos p ON verb_id = 'photoliked' AND p.photo_id = column3  -- joining the column3 with specific table 
    LEFT JOIN statustable s ON verb_id = 'statusliked' AND s.status_id = column3
于 2012-06-20T06:12:26.123 回答
1

第二个会更快,原因是第一个包含所谓的相关子查询。子查询与主查询中的记录相关。因此,对于主查询中的每个匹配记录,子查询都需要运行一次。在您的情况下,它无法运行子查询,直到它确定主查询中的 verb_id 值。这是要运行的很多查询。

第一个查询的 EXPLAIN 应表明此问题。当您在 EXPLAIN 中看到它时,它通常是一个危险信号。

于 2012-06-20T07:30:20.250 回答
1

您可以使用这种方法:

SELECT t.user_id,
       t.verb_id,
       p.photo_name  AS performedon
FROM table1 AS t
     JOIN table2 AS t2  ON t2.user_id = t.user_id  
     JOIN table3 AS t3  ON t3.verb_id = t.verb_id 
     JOIN photos AS p  ON  p.photo_id = t.column3  
                       AND t.verb_id = 'photoliked'

UNION ALL

SELECT t.user_id,
       t.verb_id,
       s.status  
FROM table1 AS t
     JOIN table2 AS t2  ON t2.user_id = t.user_id
     JOIN table3 AS t3  ON t3.verb_id = t.verb_id
     JOIN statustable AS s  ON  s.status_id = t.column3
                            AND t.verb_id = 'statusliked' ;
于 2012-06-20T07:41:40.760 回答