2016-03-06 67 views
0

在WHERE子句中使用UNION和使用OR的左外聯接之間是否存在重要的性能考慮因素?使用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); 
+1

爲什麼你不能使用union?檢查兩個查詢的解釋計劃,運行它們,你將能夠看到哪一個更好地執行 – sagi

+0

@sagi你將如何使用UPDATE?無論如何,仍然希望更好地理解這兩種方法的含義。 – user1032531

+0

@sagi或者我只是把UNION放在WHERE子句中? – user1032531

回答

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語句。

+0

你是什麼意思'你也許會發現使用聯合方法更有效率,但將更新分成多個單獨的更新語句。 – user1032531

+0

他意味着不是使用union,而是使用第一個選擇更新一次,並使用第二個(兩個不同的更新語句或更多)更新 – sagi

+0

因此,使用三個單獨的查詢? – user1032531

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" 

至於性能方面,它的主要下來指標。兩者都可以很快,都可以很慢。如果你正確地編制索引,你不應該看到兩者之間的巨大差異。