[英]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查詢優化器的獨特之處。 我從未見過Oracle , PostgreSQL或MS 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.