2017-02-13 67 views
0

項目中存在與少數幾個表相關的業務需求。在這些情況下,以下兩個查詢選項對性能優化是有利的。我應該如何選擇? 第一:過濾笛卡爾乘積:不同的SQL查詢效率

select table1.a ,table2.b from table1 ,table2 where table1.id=table2.id 

二:左外連接方式或右外連接方式

select table1.a ,table2.b from table1 left join table2 on table1.id=table2.id 

請告訴我。非常感謝你。

+0

我不明白的問題一樣一樣的。你能否詳細說明一下? – 0xCAFEBABE

+0

這兩者並不相同。 'LEFT JOIN'將返回沒有匹配'table2'行的'table1'行,笛卡爾積不會返回這些行。 – Barmar

+0

@ 0xCAFEBABE使用上述兩種方式查詢出相同的數據,但我想知道在哪種情況下使用這種方式的性能會更好 – lpgad

回答

0

如果您將它們寫入表單中,並且結果相同,則希望查詢分析器爲您提供相同的*查詢計劃。這就是說使用JOIN不,,因爲,是那麼清楚,並已經被廢棄了幾十年

如果要比較兩個不同的查詢的性能,最簡單的方法是同時運行和比較能維持多久雖然通過比較查詢計劃(mysql中的EXPLAIN query text here將爲您提供查詢計劃)來檢查他們是否做了不同的事情,但請注意,說「我知道他們給出了不同的結果,但我想要更快的一個」在編程中從來不是一件明智的事情。你應該始終知道你想要的結果。

I.e.

select table1.a ,table2.b from table1 ,table2 where table1.id=table2.id 

的含義

select table1.a ,table2.b from table1 join table2 on table1.id=table2.id 

select table1.a ,table2.b from table1 left join table2 on table1.id=table2.id 

相同的含義

select table1.a ,table2.b from table1 ,table2 where table1.id=table2.id 
union 
select table1.a , null from table1 where table1.id not in (select table2.id from table2) 

和連接,你沒有使用相同的形式:

select table1.a ,table2.b from table1 right join table2 on table1.id=table2.id 

的含義

select table1.a ,table2.b from table1 ,table2 where table1.id=table2.id 
union 
select null, table2.b from table2 where table2.id not in (select table1.id from table1) 

而且

select table1.a ,table2.b from table1 full join table2 on table1.id=table2.id 

的含義

select table1.a ,table2.b from table1 ,table2 where table1.id=table2.id 
union 
select table1.a , null from table1 where table1.id not in (select table2.id from table2) 
union 
select null, table2.b from table2 where table2.id not in (select table1.id from table1) 
-2

第二個查詢速度更快。它沒有嵌套條件。 SQL引擎將聯接視爲單個表或視圖。

在我的openion中,第一個查詢作爲「For循環」工作,因此運行時複雜度爲O(n),並且seconf查詢在reduce case運行時的複雜度爲O(log n)時作爲Switch Case工作。

+0

在任何情況下,第二個比第一個好? – lpgad

+0

SQL執行查詢計劃步驟。 OP的兩個查詢將會有類似的計劃(如果他從'left join'更改爲'join',則相同) – Caleth