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