在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);
答案 0 :(得分:2)
与许多性能问题一样,您应该测试数据和系统的结果。 union
和left 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"
至于性能,它主要取决于索引。两者都可以很快,两者都可能很慢。如果你正确地为它们编制索引,你就不应该看到两者之间的巨大差异。