在MySql查询中RegEx与LIKE的性能

Tim*_*Tim 25 mysql

有传言说:

SELECT * FROM lineage_string where lineage like '%179%' and  lineage regexp '(^|/)179(/|$)'
Run Code Online (Sandbox Code Playgroud)

会比这更快:

SELECT * FROM lineage_string where lineage regexp '(^|/)179(/|$)'
Run Code Online (Sandbox Code Playgroud)

谁能确认一下?或者知道一种测试这种查询速度的好方法.谢谢

Mar*_*ers 26

它可能更快,因为可以比正则表达式更快地评估LIKE条件,因此如果大多数行未通过测试,它可能会更快.但是,如果大多数行成功,它将会更慢,因为必须为成功的行而不是仅一个行运行两个测试.它还取决于优化器首先选择运行的表达式.

如果你有这样的东西,可以见证更大的加速:

SELECT * FROM (
   SELECT * FROM lineage_string
   WHERE lineage LIKE '179%'
) WHERE lineage regexp '^179(/|$)'
Run Code Online (Sandbox Code Playgroud)

现在可以使用索引来查找可能的行,因为LIKE'179%'是可搜索的.根本不需要检查许多行.

一如既往,最好的方法是根据实际数据自行测量.

  • 您给出的示例假设“179”位于字符串的开头,但这不是OP所要求的。 (2认同)

bob*_*nce 13

是的,它可能会快一点,因为标准SQL LIKE比完全正则表达式解析器更简单.

然而,实际上两者都非常缓慢,因为两者都不能使用指数.(LIKE如果匹配字符串不以通配符开头,则可以使用索引,但这不是这种情况.)

如果您担心速度,则应更改架构,以便可以179直接将其放入列中并对其进行索引,而不必在每行上手动检查字符串.