32

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

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

5 回答 5

12

REGEXP并且LIKE习惯于完全不同的情况。

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

在您的情况下, afirstname更有可能使用LIKEthan进行匹配REGEXP,因此,它将更加优化。

于 2013-05-20T09:47:09.893 回答
11

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

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

查询耗时 10.0418 秒。

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

查询耗时 11.0742 秒。

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

于 2019-05-11T13:35:06.397 回答
9

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多个条件查询。

于 2021-05-12T08:54:06.497 回答
6

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

于 2013-05-20T09:45:54.733 回答
0

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

LIKE 也比 REGEXP 快得多。

于 2016-01-25T05:42:48.920 回答