MySQL | 正则表达式 VS Like

36

我的数据库中有一个名为CANDIDATE的表,运行在MySQL 5.5下。我正在尝试从表中获取那些RAM包含在firstname中的行,因此我可以运行以下两个查询,但我想知道哪个查询应该长期使用以便于优化。

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

请注意,如果您正在寻找字符/字符集的实例,请使用正则表达式。 - Justin E
1
@JustinE - 在8.0版本之前,REGEXP不能正确处理utf8多字节字符。 - Rick James
5个回答

17

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


16

我已经在MySQL 8.0.13上尝试过,并在一个具有100万行+和带有索引的列的表上比较了LIKEREGEXP

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

查询用时10.0418秒。

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

查询用时11.0742秒。

LIKE的性能更快。如果可以使用它替代REGEXP,就使用它。


12

REGEXPLIKE 的使用场景完全不同。

LIKE 用于在字符串中添加通配符,而 REGEXP 用于使用正则表达式匹配属性。

在您的情况下,使用 LIKE 更有可能匹配 firstname,因此它会更加优化。


6
如果可以使用LIKE代替REGEXP,那么请使用LIKE。

0

如果您不确定值,最好使用LIKE查询而不是REGEXP。

此外,LIKE比REGEXP快得多。


1
你能提供任何支持“LIKE比REGEXP快得多”的说法的信息吗? - baxx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接