2011-01-22 45 views
6

在回答this SQL question時,我遇到了一個聲明,即固定值IN()運算符比具有相同內容的INNER JOIN慢得多,以至於它更好爲這些值創建臨時表並加入它們。這是真的嗎(一般來說,使用MySQL,任何其他SQL引擎),如果是的話 - 爲什麼?直觀地說,IN應該更快 - 您將潛在的匹配與固定的一組值相比較,這些值已經以內存和所需格式存在,而使用JOIN時,您必須查閱索引,可能會從磁盤加載數據,以及執行IN可能不需要的其他操作。我錯過重要的東西嗎?SQL固定值IN()與INNER JOIN性能

請注意,與this question不同,它有很多重複項,我說的是IN()有固定的一組值,而不是子查詢。

+0

這絕對是不同的數據庫平臺之間的東西。在我使用SQL Server和PostgreSQL的經驗中,針對索引的常量上的「IN」子句非常快。 – Pointy 2011-01-22 23:09:21

+0

您鏈接的問題是SQL Server。不知道你是否已經意識到,但MySQL可以是非常糟糕的[與子查詢](http://stackoverflow.com/questions/3417074/why-would-an-in-condition-be-slower -than-in-sql/3417190#3417190) – 2011-01-22 23:15:09

回答

7

這與IN子句的長度有關 - 在MySQL中有時稱爲BUG。

MySQL似乎有一個IN子句的低門檻,當它將交換到TABLE/INDEX SCAN而不是收集多個分區(每個IN項目一個)併合並它們。

隨着內部聯接,它幾乎總是被迫使用直接行到行加入收藏,這就是爲什麼有時快

參考這些MySQL手冊頁

,因爲它似乎暗示IN (constant value list)應該ALWA我可能是錯的ys使用二進制搜索每個項目...