本文

今天在查找 SQL 效能 Like 會引起吃不到索引的情況忽然學會一招,一定要趕快紀錄一下。

在處理模糊搜尋的條件常常會使用 LIKE’%關鍵字%’ 這種做法,但 SQL 的索引在 LIKE’%關鍵字’ 的情況會失效,更不用說使用 LIKE’%關鍵字%’ 當資料一大效能真的是非常差。

這裡介紹一個替代使用語法 CHARINDEX
首先我們先看一下MSDN介紹用法。

這裡可以知道 charindex 其實是可以用來計算兩個字元間有多少相同的地方。
現在來測試一下

SELECT CHARINDEX('a',' apple is apple')

結果:

或是可以用來判斷相同的字元出現的位子。

SELECT CHARINDEX('a','appleisapple',5)

結果:

這邊第三個參數5是從第五個字元開始往後搜尋。
所以如果改成0結果就會是

SELECT CHARINDEX('a','appleisapple',0)

結果:

替代 LIKE 的方式

好了說了這麼多到底要怎麼替代 LIKE 呢?
可以使用這種方式替代

CHARINDEX('模糊搜尋關鍵字', 要搜尋的資料行) > 0

實際測試,使用NorthWind Product Table

SELECT *
  FROM [Northwind].[dbo].[Products]
  where CHARINDEX('a',ProductName) > 0

使用CHARINDEX結果:

SELECT *
  FROM [Northwind].[dbo].[Products]
  where ProductName LIKE '%a%'

使用 LIKE 結果:

哪種方式比較好?

因為在家裡沒有這麼大量的資料做測試,在公司的時候實際測試,如果再沒有吃到索引的情況下 CHARINDEX 會比 LIKE 還要快,但如果有吃到索引 LIKE 的速度還是優於 CHARINDEX 的。

所以如果在非得需要進行 LIKE’%關鍵字%’ 搜尋資料時,沒辦法吃到索引,就可以使用 CHARINDEX 來替代 LIKE,大家可以自行測試看看。

參考資料