4 回答

TA貢獻(xiàn)1842條經(jīng)驗(yàn) 獲得超21個(gè)贊
摘自MySQL手冊(cè)(13.2.10.11重寫子查詢作為連接):
LEFT [OUTER] JOIN可以比等效的子查詢更快,因?yàn)榉?wù)器可能能夠更好地優(yōu)化它 - 這一事實(shí)并非僅針對(duì)MySQL Server。
因此子查詢可能比較慢LEFT [OUTER] JOIN
,但在我看來(lái),它們的強(qiáng)度可讀性稍高。

TA貢獻(xiàn)1765條經(jīng)驗(yàn) 獲得超5個(gè)贊
子查詢是解決形式問(wèn)題的邏輯上正確的方法,“從A獲取事實(shí),以B中的事實(shí)為條件”。在這種情況下,在子查詢中粘貼B比進(jìn)行連接更合乎邏輯。從實(shí)際意義上說(shuō),它也更安全,因?yàn)槟悴槐匾驗(yàn)槎啻纹ヅ銪而從A中獲取重復(fù)的事實(shí)時(shí)要謹(jǐn)慎。
然而,實(shí)際上,答案通常歸結(jié)為性能。一些優(yōu)化器在給出連接和子查詢時(shí)會(huì)吮吸檸檬,而另一些優(yōu)化者則以另一種方式吮吸檸檬,這是特定于優(yōu)化器,特定于DBMS的版本和查詢特定的。
從歷史上看,顯式連接通常會(huì)獲勝,因此連接的既定智慧更好,但優(yōu)化器一直在變得越來(lái)越好,所以我更喜歡先以邏輯連貫的方式編寫查詢,然后在性能限制要求時(shí)進(jìn)行重組。

TA貢獻(xiàn)2041條經(jīng)驗(yàn) 獲得超4個(gè)贊
在大多數(shù)情況下,JOIN
s比子查詢更快,并且子查詢的速度非常快。
在JOIN
SDB中,RDBMS可以創(chuàng)建一個(gè)更適合您的查詢的執(zhí)行計(jì)劃,并且可以預(yù)測(cè)應(yīng)該加載哪些數(shù)據(jù)以進(jìn)行處理并節(jié)省時(shí)間,這與子查詢不同,后者將運(yùn)行所有查詢并加載所有數(shù)據(jù)以進(jìn)行處理。
子查詢的好處是它們比JOIN
s 更具可讀性:這就是大多數(shù)新SQL用戶更喜歡它們的原因; 這是簡(jiǎn)單的方法; 但是在性能方面,JOINS在大多數(shù)情況下都更好,即使它們也不難讀。

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超2個(gè)贊
使用EXPLAIN查看數(shù)據(jù)庫(kù)如何對(duì)數(shù)據(jù)執(zhí)行查詢。在這個(gè)答案中有一個(gè)巨大的“取決于”......
當(dāng)PostgreSQL認(rèn)為一個(gè)子查詢比另一個(gè)更快時(shí),它可以將子查詢重寫為連接或子查詢的連接。這一切都取決于數(shù)據(jù),索引,相關(guān)性,數(shù)據(jù)量,查詢等。
添加回答
舉報(bào)