[問題摘要:2個SQL語句產生相同的結果,但速度不同。一個聲明使用JOIN
,其他用途IN
。 JOIN
快於IN
]MySQL(版本5.5):爲什麼`JOIN`比`IN`子句快?
我嘗試了2種SELECT
聲明對2個表,命名爲 booking_record和夾雜。表夾雜物與表 booking_record有多對一的關係。
(不包括爲簡單起見表定義。)
首先聲明:(使用IN
子句)
SELECT
id,
agent,
source
FROM
booking_record
WHERE
id IN
(SELECT DISTINCT
foreign_key_booking_record
FROM
inclusions
WHERE
foreign_key_bill IS NULL
AND
invoice_closure <> FALSE
)
第二語句:(使用JOIN
)
SELECT
id,
agent,
source
FROM
booking_record
JOIN
(SELECT DISTINCT
foreign_key_booking_record
FROM
inclusions
WHERE
foreign_key_bill IS NULL
AND
invoice_closure <> FALSE
) inclusions
ON
id = foreign_key_booking_record
與300,000行在 booking_record - 表和6,100,000+行內含物 -table;第二個聲明在0.08秒內傳遞了127行,但第一個聲明花費了將近21分鐘的時間記錄。
爲什麼JOIN
比IN
子句快得多?
我建議你開始使用'EXPLAIN'兩個語句並查看結果來探討這個問題。 – 2014-09-02 13:30:14
第二個還有一個過濾器'id = foreign_key_booking_record'。 – 2014-09-02 13:33:13
性能差異的最可能解釋是生成的執行計劃中的差異。正如其他答案已經表明的那樣,'EXPLAIN'的輸出將顯示每個查詢的執行計劃。 IN(子查詢)的一個重大性能問題:MySQL可能對外部查詢返回的每一行執行子查詢。 – spencer7593 2014-09-02 14:09:12