2009-02-18 63 views
28

首先,我承認兩者之間的區別:
- 就像使可用通配符%和_
- 顯著尾隨空白
- colation發出使用像主場迎戰=爲精確字符串匹配

所有其他條件不變,一個精確的字符串匹配這是更有效的:

SELECT field WHERE 'a' = 'a'; 

或者:

SELECT field WHERE 'a' LIKE 'a'; 

或者:差異是否微不足道,無關緊要?

+4

霸菱一個完全新空房禁地:

SELECT field WHERE name = binary 'pax' 

你可以像測試此實施中,字符串比較風格的代價將被數據從磁盤移出的代價所壓倒。寫出你真正的意思,並繼續編程。 – 2009-02-18 01:49:18

+2

這已經在stackoverflow上覆蓋了[here](http://stackoverflow.com/questions/543580/equals-vs-like)。我希望這有幫助。 – user34867 2009-02-18 01:36:14

回答

29

我會說=比較器會更快。詞法不會將比較發送到另一個詞彙系統來進行一般匹配。相反,引擎能夠匹配或繼續前進。我們的db在工作中有數百萬行,並且=總是更快。

3

在一個體面的DBMS中,數據庫引擎會識別字符串中沒有通配符,並將其隱式轉換爲純粹的相等(不一定與=相同)。所以,你在開始時只會遇到小的性能問題,通常對於任何像樣大小的查詢都可以忽略不計。

但是,MySQL =運算符不一定按照您期望的方式運行(作爲純粹的相等性檢查)。具體來說,它默認情況下不考慮尾部的空格爲CHARVARCHAR數據,這意味着:

SELECT age WHERE name = 'pax' 

會給你行的'pax''pax<one space>''pax<a hundred spaces>'

如果你想要做一個適當平等檢查,使用binary關鍵字:

mysql> create table people (name varchar(10)); 

mysql> insert into people value ('pax'); 
mysql> insert into people value ('pax '); 
mysql> insert into people value ('pax '); 
mysql> insert into people value ('pax '); 
mysql> insert into people value ('notpax'); 

mysql> select count(*) from people where name like 'pax'; 
1 

mysql> select count(*) from people where name = 'pax'; 
4 

mysql> select count(*) from people where name = binary 'pax'; 
1