【问题标题】:MySQL | REGEXP VS LikeMySQL |正则表达式 VS 喜欢
【发布时间】:2013-05-14 20:15:06
【问题描述】:

我的数据库中有一个表 CANDIDATE,它在 MySQL 5.5 下运行,我正在尝试从 RAM 包含名字的表中获取行,所以我可以在两个查询下运行,但我现在想知道哪个查询我们在优化方面应该长期使用。

SELECT * FROM CANDIDATE c WHERE firstname REGEXP 'ram';
SELECT * FROM CANDIDATE c WHERE firstname LIKE'%ram%';

【问题讨论】:

  • 请注意,如果您要查找字符/字符集的实例,请使用正则表达式。
  • @JustinE - 在 8.0 版之前,REGEXP 无法正确处理 utf8 多字节字符。

标签: mysql regex database-performance


【解决方案1】:

REGEXPLIKE 用于完全不同的情况。

LIKE 用于将通配符添加到字符串,而REGEXP 用于将属性与正则表达式匹配。

在您的情况下,firstname 更有可能使用 LIKE 进行匹配,而不是使用 REGEXP,因此会更加优化。

【讨论】:

    【解决方案2】:

    我已经在MySQL 8.0.13 上进行了尝试,并在具有索引的列上有 1M+ 行的表上比较了 LIKEREGEXP

    SELECT * FROM table WHERE column LIKE '%foobar%';
    

    查询耗时 10.0418 秒。

    SELECT * FROM table WHERE REGEXP_LIKE(column, 'foobar');
    

    查询耗时 11.0742 秒。

    LIKE 性能更快。如果您可以使用它而不是REGEXP,那就去做吧。

    【讨论】:

      【解决方案3】:

      MySQL 中的 LIKE 与 REGEXP

      • 单一条件:LIKE 更快
      • 多种条件:REGEXP 更快

      示例

      一个真实的例子可能是:查找所有包含 CRLF、LF 或 CR 的转义回车的行。

      单一条件

      SELECT * FROM comments WHERE text LIKE '%\\\\n%'; ? Faster
      SELECT * FROM comments WHERE text REGEXP '\\\\n'; ? Slower
      

      多个条件

      SELECT * FROM comments
      WHERE text LIKE '%\\\\r\\\n%'
      OR text LIKE '%\\\\n%'
      OR text LIKE '%\\\\r%'; ? Slower
      
      SELECT * FROM comments
      WHERE text REGEXP '((\\\\r\\\\n)|(\\\\(n|r)))'; ? Faster
      

      结论

      LIKE 用于单个条件查询,REGEXP 用于多个条件查询。

      【讨论】:

        【解决方案4】:

        如果您可以使用 LIKE 代替 REGEXP,请使用 LIKE

        【讨论】:

          【解决方案5】:

          如果您不确定价值,请更好地使用 LIKE 查询而不是 REGEXP。

          LIKE 也比 REGEXP 快得多。

          【讨论】:

          • 您能否提供支持“LIKE 比 REGEXP 快得多”这一说法的任何信息
          猜你喜欢
          • 2011-03-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多