我的数据库中有一个表 CANDIDATE,它在 MySQL 5.5 下运行,我试图从 RAM 中包含名字的表中获取行,所以我可以运行以下两个查询,但我现在想知道我们应该使用哪个查询长期来看优化。
SELECT * FROM CANDIDATE c WHERE firstname REGEXP 'ram';
SELECT * FROM CANDIDATE c WHERE firstname LIKE'%ram%';
我的数据库中有一个表 CANDIDATE,它在 MySQL 5.5 下运行,我试图从 RAM 中包含名字的表中获取行,所以我可以运行以下两个查询,但我现在想知道我们应该使用哪个查询长期来看优化。
SELECT * FROM CANDIDATE c WHERE firstname REGEXP 'ram';
SELECT * FROM CANDIDATE c WHERE firstname LIKE'%ram%';
REGEXP
并且LIKE
习惯于完全不同的情况。
LIKE
用于向字符串添加通配符,而REGEXP
用于将属性与正则表达式匹配。
在您的情况下, afirstname
更有可能使用LIKE
than进行匹配REGEXP
,因此,它将更加优化。
我已经在具有索引的列上有 1M+ 行的表上进行了尝试并进行了MySQL 8.0.13
比较:LIKE
REGEXP
SELECT * FROM table WHERE column LIKE '%foobar%';
查询耗时 10.0418 秒。
SELECT * FROM table WHERE REGEXP_LIKE(column, 'foobar');
查询耗时 11.0742 秒。
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
多个条件查询。
如果您可以使用 LIKE 代替 REGEXP,请使用 LIKE
如果您不确定价值,请更好地使用 LIKE 查询而不是 REGEXP。
LIKE 也比 REGEXP 快得多。