簡體   English   中英

使用IN進行JOIN或INNER SELECT,哪個更快?

[英]JOIN or INNER SELECT with IN, which is faster?

我想知道使用IN進行INNER JOIN或INNER SELECT哪個更快?

select t1.* from test1 t1
inner join test2 t2 on t1.id = t2.id
where t2.id = 'blah'

要么

select t1.* from test1 t1
where t1.id IN (select t2.id from test2 t2 where t2.id = 'blah')

假設id是關鍵,這些查詢的含義是相同的,一個不錯的DBMS將以完全相同的方式執行它們。 不幸的是,MySQL沒有這樣做,可以通過在此SQL Fiddle中擴展“查看執行計划”鏈接來看到。 哪一個會更快取決於表的大小-如果TABLE1行很少,則IN有機會更快,而JOIN在所有其他情況下都可能更快。

這是MySQL查詢優化器的獨特之處。 我從未見過OraclePostgreSQLMS SQL Server以不同的方式執行這種簡單的等效查詢。

如果您不得不猜測, INNER JOIN可能比IN (SELECT ...)效率更高,但是從一個查詢到另一個查詢可能有所不同。

EXPLAIN關鍵字是您最好的朋友之一。 在完整的SELECT查詢前面輸入EXPLAIN ,MySQL將為您提供有關如何執行查詢的一些基本信息。 它會告訴您在何處使用文件排序,在何處使用已創建的索引(以及在何處忽略它們)以及可能需要檢查多少行才能滿足請求。

如果其他所有條件都相同,則主要使用INNER JOIN因為它更容易預測,因此對於新來的開發人員來說更容易理解。但是,當然,如果您看到IN (SELECT ...)表單的真正優勢,請使用它!

盡管您必須在查詢的任何RDBS上檢查執行計划,但我認為inner join會更快或至少相同。 如果我錯了,也許有人會糾正我。

無論如何,嵌套選擇很可能會運行整個內部查詢,並從test2構建可能值的哈希表。 如果該查詢返回一百萬行,則無論如何都要承擔將數據加載到內存中的費用。

使用內部聯接,如果test1僅具有2行,則可能只需在test2進行2次索引掃描以獲取這些行中每行的id值,而不必將一百萬行加載到內存中。

更為現代的數據庫系統也有可能優化第一種情況,因為它在每個表上都有統計信息,但是在最佳情況下,內部聯接將是相同的。

在大多數情況下,JOIN比子查詢快得多,但是子查詢比JOIN更具可讀性。

RDBMS針對JOIN創建執行計划,因此可以預測應該加載哪些數據進行處理。 這絕對可以節省時間。 另一方面,對於子查詢,它運行所有查詢並加載所有數據以進行處理。

有關更多詳細信息,請檢查此鏈接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM