【问题标题】:Using LIKE vs. = for exact string match使用 LIKE vs. = 进行精确的字符串匹配
【发布时间】:2010-10-08 06:04:48
【问题描述】:

首先,我认识到两者之间的区别:
- Like 使通配符 % 和 _
可用 - 重要的尾随空格
- 整理问题

所有其他条件都相同,以获得更有效的精确字符串匹配:

SELECT field WHERE 'a' = 'a';

或者:

SELECT field WHERE 'a' LIKE 'a';

或者:差异是如此微不足道以至于无关紧要吗?

【问题讨论】:

  • 这之前已经在 stackoverflow 上讨论过 here。我希望这会有所帮助。
  • 谢谢,我在发帖前搜索了这个,但没有看到它。
  • 你可以做的是使用谷歌为你搜索stackoverflow。它有时会返回更相关的结果。
  • 在完全脑死的实现中,任何一种字符串比较的成本都将与将数据移出磁盘的成本相形见绌。写出你真正的意思并继续编程。

标签: mysql string performance


【解决方案1】:

我会说 = 比较器会更快。词法不会将比较发送到另一个词法系统来进行一般匹配。相反,引擎能够匹配或继续前进。我们工作的数据库有数百万行,而 = 总是更快。

【讨论】:

    【解决方案2】:

    在一个不错的 DBMS 中,DB 引擎会识别出字符串中没有通配符,并隐含地将其转换为纯相等(不一定与 = 相同)。因此,一开始您只会受到很小的性能影响,对于任何体面的查询来说通常可以忽略不计。

    然而,MySQL = 操作符并不一定会按照您期望的方式运行(作为纯粹的相等检查)。具体来说,默认情况下它不考虑 CHARVARCHAR 数据的尾随空格,这意味着:

    SELECT age WHERE name = 'pax'
    

    将为您提供'pax''pax<one space>''pax<a hundred spaces>' 的行。

    如果您想进行正确相等性检查,请使用binary 关键字:

    SELECT field WHERE name = binary 'pax'
    

    你可以用类似的东西来测试这个:

    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
    

    【讨论】:

    • 很好的更新,但与这个问题更相关,LIKE“基于每个字符执行匹配”,这意味着引擎无法将LIKE优化为=,所以@987654336 @ 几乎肯定会更慢。这也意味着这两个运算符的行为取决于排序规则,但这与这个问题的相关性较小。
    • @Flimzy 你能详细说明一下吗? AFAIK,= 也会在每个字符的基础上进行比较(当然不匹配),除非您在某处指定 binary
    • @Binarus = 的比较对于复合字符是不同的,例如 ä。见the manual for details
    • @Flimzy 我明白了。谢谢你和+1。我从来没有遇到过这个问题,因为我总是使用 utf8 作为字符集,使用 utf8_bin 作为排序规则。
    猜你喜欢
    • 2021-10-18
    • 1970-01-01
    • 2015-10-26
    • 1970-01-01
    • 2022-11-26
    相关资源
    最近更新 更多