使用OR与UNION进行左外连接

时间:2016-03-06 14:33:45

标签: mysql sql

在WHERE子句中使用UNION与LEFT OUTER JOIN和OR之间是否存在重要的性能考虑因素?

这两个查询之间有什么区别?

使用LEFT OUTER JOIN而不是UNION通常会更好吗?

我问的理由是我实际上需要进行INSERT,即使我想要也不能使用UNION。

SELECT t.foo
FROM t
INNER JOIN t1 t1.t_id=t.id
WHERE t1.id IN (1,2,3)
UNION
SELECT t.foo
FROM t
INNER JOIN t2 t2.t_id=t.id
INNER JOIN t2a ON t2a.t2_id=t2.id
WHERE t2a.id IN (1,2,3)
UNION
SELECT t.foo
FROM t
INNER JOIN t3 t3.t_id=t.id
INNER JOIN t3a ON t3a.t3_id=t3.id
WHERE t3a.id IN (1,2,3);

SELECT DISTINCT t.foo
FROM t
LEFT OUTER JOIN t1 t1.t_id=t.id
LEFT OUTER JOIN t2 t2.t_id=t.id
LEFT OUTER JOIN t2a ON t2a.t2_id=t2.id
LEFT OUTER JOIN t3 t3.t_id=t.id
LEFT OUTER JOIN t3a ON t3a.t3_id=t3.id
WHERE t1.id IN (1,2,3) OR t2a.id IN (1,2,3) OR t3a.id IN (1,2,3);

UPDATE t
LEFT OUTER JOIN t1 t1.t_id=t.id
LEFT OUTER JOIN t2 t2.t_id=t.id
LEFT OUTER JOIN t2a ON t2a.t2_id=t2.id
LEFT OUTER JOIN t3 t3.t_id=t.id
LEFT OUTER JOIN t3a ON t3a.t3_id=t3.id
SET t.foo="bar"
WHERE t1.id IN (1,2,3) OR t2a.id IN (1,2,3) OR t3a.id IN (1,2,3);

2 个答案:

答案 0 :(得分:2)

与许多性能问题一样,您应该测试数据和系统的结果。 unionleft join正在做非常不同的事情 - 哪个更好可能取决于您的数据功能,可用索引和其他注意事项。

但是,您可以使用union中的update方法。你只需要一个子查询:

update t join
       (select t.id, t1.foo . . .
        union . . . 
        select t.id, t2.foo
       ) tt
       on t.id = tt.id
    set t.foo = 'foo'
    where . . .;

您可能还会发现使用union方法更有效,但要将更新分解为多个单独的update语句。

答案 1 :(得分:2)

可以在插入中使用UNION

INSERT INTO `table`
SELECT * FROM   
(
    SELECT '1'
    UNION
    SELECT '2'
) x

同样适用于更新:

UPDATE `table1` t1
JOIN (
    SELECT '1' as col1
    UNION
    SELECT '2'
) x ON x.col1 = t1.colX  
SET t1.whateverColumn = "someValue"

至于性能,它主要取决于索引。两者都可以很快,两者都可能很慢。如果你正确地为它们编制索引,你就不应该看到两者之间的巨大差异。

相关问题