2012-07-13 212 views
0

我最近被告知,不推薦在SQL中使用「LIKE」關鍵字。這是真的?如果是的話爲什麼如果是真的,有沒有其他的選擇?爲什麼不推薦在SQL中使用「LIKE」?

+0

誰來 - 有沒有我們可以參考的參考? – Mark 2012-07-13 22:08:09

+0

我不認爲有更快的替代方案 – 2012-07-13 22:09:35

+0

@Mark是我的一位導師。 – KyelJmD 2012-07-13 22:25:21

回答

3

原因主要是表現。然而,在論點的另一方面,LIKE是標準的SQL,應該可以在所有數據庫中工作。由於LIKE必須解析模式字符串,因此比在較長字符串中查找子字符串(使用charindex或instr或數據庫最喜歡的函數)要低效。但是,處理器速度如此之快,以至於現在這種情況很少有所改變,除了最大的查詢之外。

LIKE的一個注意事項是在一個連接語句中(對於替代方法也是如此)。通常,數據庫引擎不會在連接中使用L​​IKE的索引。因此,如果您能夠以更適合索引的方式表達聯合條款,那麼您可能會看到性能大幅增加。順便說一下,我是SQL語言的老前輩,並且傾向於避免個人使用它。然而,這不是一個應該傳遞的習慣,因爲避免它的基礎已經沒有了。

+0

LIKE有沒有更快的選擇? – KyelJmD 2012-07-13 22:27:32

+0

在SQL Server中,我通常使用「charindex(,<搜索字符串>)> 0」。在Oracle和MySQL中,函數是instr()。但是,讓我強調一下,性能差異很小(在大多數數據庫中),LIKE是標準SQL,我喜歡鼓勵。 – 2012-07-13 22:38:52

+0

如果不需要通配符,可以使用'LOCATE()'或類似的子字符串函數。至少在MySQL世界中,其他選擇包括'REGEXP'(更強大,更慢)或'MATCH ... AGAINST'(如果您使用'FULLTEXT'索引,則功能強大且快速)。快速'LIKE'性能需要一個char列,它可以自己編制索引,也可以是多列索引的第一個組成部分,在搜索字符串的開頭沒有通配符(請參閱hectorg87的答案)。每種技術也可以用不同的字符編碼表現不同,請查閱MySQL手冊瞭解詳細信息。 – 2012-07-14 00:21:13

2

特別是在MySQL中(因爲這有一個MySQL標籤,我猜這就是你正在使用的),當在一個有索引的列上使用LIKE時,你應該小心不要把%放在字符串的前面如果你不需要匹配,因爲它會殺死使用索引進行有效查找的可能性,否則在使用LIKE時沒有問題。例如

BAD:

col_with_index LIKE '%someText' 

GOOD:

col_with_index LIKE 'someText%' 
+2

這就是所謂的「正在被sargable」,並且是'LIKE'的一般規則,而不僅僅是MySQL的怪癖。 – 2012-07-13 22:39:54

+0

@Jon我不想推廣,因爲我不知道其他RDBMS,但是我爲MySQL做。稍後我會研究一下「正在進行測試」。謝謝,很高興知道這一點。 – hectorg87 2012-07-13 22:45:59

0

沒有正當理由不喜歡使用!

唯一的例外是當您可以使用EQUAL(=)運算符來實現相同的結果(my_column LIKE'XYZ')。

如果您需要使用LIKE任何其他替代方法來實現相同的結果應該會導致相同(或更多)的性能問題!

因此,在這些情況下,只要想想如果使用像是必要的,然後毫不猶豫地使用它。