2011-01-22 21 views
1

我對「兩個或多個單獨的SQL命令」或「1但使用'join'SQL命令」的性能表示懷疑。使用兩條單​​獨的SQL語句或一條SQL語句加入JOIN會更快嗎?

這裏是東西:

例如,我有兩個表:postuser

post已指示該職位爲user_id是由一些用戶在user

發行和我去提取帖子和用戶名。

我可以

 
SELECT * FROM `post` LEFT JOIN `user` on post.user_id = user.id WHERE 1 

 
$rows = $db->sql("SELEFT * FROM `post` WHERE 1") 
for $row in $rows: 
    $db->sql("SELECT * FROM `user` WHERE id = $row['user_id']") 

我不知道哪一個會有更好的表現?

如果我有3個或更多的表加入,哪種方式會更好(從性能角度來看)?

+0

與INNER JOIN相比,使用LEFT JOIN(或RIGHT JOIN或FULL JOIN)有一個(通常很小但不是零)的性能損失。如果可以的話,避免使用LEFT JOIN並使用JOIN。你會有一個沒有用戶記錄的帖子嗎?如果不是(你不應該),那麼INNER JOIN是合適的。 – 2012-03-03 16:27:36

回答

5

連接幾乎總是會有更好的表現。即使它檢索的數據「很大」,您仍然只執行單個查詢。

這就像買雜貨。更容易開車到商店一次,填滿一輛車,並與許多不同的物品回家,而不是去商店,買一件東西,回家,再去商店,再買一件。

這些行程中的每一個都會加起來,你最終會花更多的時間駕駛,而不是享受你的雜貨。

+0

謝謝!我認爲這是一個很好的例子,我現在明白了。 – 2011-01-23 12:58:39

3

強烈建議您使用LEFT JOIN,因爲否則將循環中的查詢(如第二個示例中所示)會將數據庫中的命中數倍增,這也是一種危險情況。

3

請注意,您沒有執行2個查詢。您正在執行第一個查詢一次,第二個查詢執行N次,其中N是第一個查詢返回的行數。這比讓查詢優化器處理單個連接查詢要昂貴得多。

數據庫優化器由專家精心編寫,以最大限度地降低運營成本。如果您嘗試通過運行單獨的查詢來再次猜測優化器,則每次都會嚴重失去 - 除非優化器嚴重吹響它。除此之外,DBMS必須在每次調用時在第二條語句上準備變體,而不是僅調用一次。優化器必須非常惡劣,以至於不會發生。