Var*_*pta 24 regex mysql database-performance
我在我的数据库中有一个表CANDIDATE在MySQL 5.5下运行,我试图从第一个名称中包含RAM的表中获取行,所以我可以运行以下两个查询,但我想现在我们应该使用哪个查询关于优化的长期.
SELECT * FROM CANDIDATE c WHERE firstname REGEXP 'ram';
SELECT * FROM CANDIDATE c WHERE firstname LIKE'%ram%';
Run Code Online (Sandbox Code Playgroud)
Isa*_*uge 19
现实世界的示例可能是:查找包含转义回车符 CRLF、LF 或 CR 的所有行。
SELECT * FROM comments WHERE text LIKE '%\\\\n%'; Faster
SELECT * FROM comments WHERE text REGEXP '\\\\n'; Slower
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
用于LIKE
单条件查询和REGEXP
多条件查询。
dra*_*eus 10
REGEXP
并LIKE
习惯于完全不同的情况.
LIKE
用于将通配符添加到字符串,而REGEXP
用于将属性与正则表达式匹配.
在你的情况下,firstname
更容易使用匹配LIKE
比REGEXP
,因此,它会更加优化.
我已经尝试过并在带有索引的列上有 1M+ 行的表上MySQL 8.0.13
进行了LIKE
对比REGEXP
:
SELECT * FROM table WHERE column LIKE '%foobar%';
Run Code Online (Sandbox Code Playgroud)
查询耗时 10.0418 秒。
SELECT * FROM table WHERE REGEXP_LIKE(column, 'foobar');
Run Code Online (Sandbox Code Playgroud)
查询耗时 11.0742 秒。
LIKE
性能更快。如果您可以使用它而不是REGEXP
,那就去做吧。