2016-02-22 26 views
0

以下是否有任何性能差異?SQL:像OR與IN

NAME LIKE '%EXPRESSION_1%' 
OR NAME LIKE '%EXPRESSION_2%' 
... 
OR NAME LIKE '%EXPRESSION_N%' 

VS

NAME IN (ACTUAL_VALUE_1,ACTUAL_VALUE_2,.., ACTUAL_VALUE_N) 
+0

http://stackoverflow.com/questions/782915/mysql-or-vs-in-performance – DonCallisto

+3

這兩個條件不是一回事。你無法比較它們。要找出哪個更有效,只需檢查執行計劃。 –

+0

LIKE命令慢於等於。 IN正在工作看起來像OR一樣。 – mkysoft

回答

2

IN版本潛在的很多,很多固定河

這兩個版本做不是做同樣的事情。但是,如果滿足您的需求,IN版本可以利用NAME上的索引。 LIKE版本不能,因爲模式以通配符開頭。

你可以這樣寫:

WHERE NAME LIKE 'EXPRESSION_%' 

如果滿足您的需求,它也可以採取NAME指數的優勢。

1

您可以簡單地嘗試使用

NAME LIKE '%EXPRESSION_%' 

至於表現而言則IN比較快於OR。您也可以使用兩個查詢的執行計劃來確認性能。

同樣如上所述,您顯示的兩個查詢是不同的。

第一個查詢:

NAME LIKE '%EXPRESSION_1%' 
OR NAME LIKE '%EXPRESSION_2%' 
... 
OR NAME LIKE '%EXPRESSION_N%' 

將嘗試獲取具有像

EXPRESSION_123 
XXXEXPRESSION_1234 
EXPRESSION_2323 
EXPRESSION_2...... 

樣本數據的結果,而你的第二個查詢將匹配的精確匹配,以

ACTUAL_VALUE_1,ACTUAL_VALUE_2..... 
記錄
+1

我認爲有必要提到LIKE子句很容易使列上的索引無效,尤其是當它在兩側都是通配符時。因此,執行LIKE而不是嚴格比較的性能損失可能非常高,比較OR和IN在優化方面沒有意義,在這種情況下 –

0

如果您使用的變量表達式可以根據給定的參數進行更改。然後使用

declare @Expression1 varchar(50) 
Set @Expression2 = '%'+ @Expression1 +'%' 


    NAME LIKE @Expression2 

所以無論參數會在@Expression1它會自動照顧它。