2010-07-29 260 views
5

可能重複:
Is there a performance difference between BETWEEN and IN with MySQL or in SQL in general?SQL:BETWEEN和IN(這是更快)

如果我有以下ID:

1,2,3,4, 5,6

使用IN還是使用IN子句進行刪除會更好嗎?

+0

我會認爲性能是相同的查詢或刪除。 – FrustratedWithFormsDesigner 2010-07-29 15:40:44

+2

老實說,這種問題不能在*取決於*之外得到回答。 「之間」似乎就在這裏,但速度更快嗎?它會一直更快嗎?在刪除數據的情況下,這是相當可觀的?你有什麼DBMS,索引等。只有你可以通過檢查來回答這個問題。 – Kobi 2010-07-29 15:40:44

+0

對不起MSSQL 2005 – RPS 2010-07-29 16:01:23

回答

9
  • 如果你的ID是總是連續你應該使用BETWEEN
  • 如果您的ID 可能連續或可能不連續則使用IN

表現不應該是真正的決定因素。話雖如此,BETWEEN似乎在我測試過的所有例子中都更快。例如:

沒有索引,檢查表一萬行,其中每行都有X = 1:

 
SELECT COUNT(*) FROM table1 WHERE x IN (1, 2, 3, 4, 5, 6); 
Time taken: 0.55s 

SELECT COUNT(*) FROM table1 WHERE x BETWEEN 1 AND 6; 
Time taken: 0.54s 

沒有索引,檢查表一萬行,其中x是唯一值:

 
SELECT COUNT(*) FROM table1 WHERE x IN (1, 2, 3, 4, 5, 6); 
Time taken: 0.65s 

SELECT COUNT(*) FROM table1 WHERE x BETWEEN 1 AND 6; 
Time taken: 0.36s 

一個更現實的例子是id列是唯一的並且被編入索引。當你這樣做時,兩個查詢的性能都變得接近即時。

 
SELECT COUNT(*) FROM table2 WHERE x IN (1, 2, 3, 4, 5, 6); 
Time taken: 0.00s 

SELECT COUNT(*) FROM table2 WHERE x BETWEEN 1 AND 6; 
Time taken: 0.00s 

所以我會說專注於寫一個清晰的SQL語句,而不是擔心執行速度的細微差異。並確保表正確索引,因爲這會造成最大的差異。

注意:測試是在SQL Server Express 2008 R2上執行的。其他系統的結果可能不同。

+0

我有驚喜,在''之間'''之間'使用索引,而不是其他。兩種方式。做一個查詢突然行爲不當(取決於實際值),因爲它是作爲'全面掃描'而不是*邏輯*'索引掃描'處理的...... – pascal 2010-07-29 19:00:36

+0

在大多數情況下,我同意馬克,但請注意,當性能是因素,你應該考慮你的指數和基準兩個選項。我在MySQL中使用'IN'的情況比使用'BETWEEN'快得多。 – 2012-10-06 17:27:36

4

IN相當於1 or 2 or 3 or 4 or 5

之間相當於>= 1 and <= 6

我個人之間的範圍內使用,但具體情況和DB引擎可以有所作爲了。

+2

+1,**我從不在**之間使用,它是否包含端點?每個人似乎都忘記了,所以我使用'> ='或'>'以及'<='或'<',並且如果包含或不包含端點,它就很清晰。 – 2010-07-29 15:49:44

+0

@KM,它包括端點,包含端點和imho,錯誤命名。 – CaffGeek 2010-07-29 16:05:39

+0

@Chad,謝謝;-)但我說'每個人似乎都忘記了',不是我忘了。對於我來說,英文裏的「between」意味着裏面的物品。所以當我說你可以擁有我手中的一切時,我的意思並不是我的手!通過編寫代碼來包含實際的'> ='/'>'和'<='/'<',您可以清楚地瞭解您的意圖,從而更容易理解代碼。 – 2010-07-29 18:10:37

2

取決於是否實施索引。如果id是主鍵,那麼這兩個查詢應該具有相同的成本。使用分析器評估SQL。

1

條款之間,除非您預計ID將來會有所不同。

0

由於較少的比較,兩者之間速度更快。 使用IN子句每次遍歷每個元素。

但兩者的目的是不同的:

  • 當你與值範圍在某種 序列的比較 使用之間。

  • 當與不在 序列中的值比較時,使用IN。