2009-02-18 64 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