mySQL - 我应该更喜欢REGEXP来获得更快的搜索结果吗?

时间:2016-10-15 01:59:30

标签: php mysql

我有一个查询,它会在特定行中搜索3个值。表中记录太多。我在论坛上听说REGEXP是一个糟糕的选择。我很困惑,希望听到您对更快搜索结果的建议。

SELECT shareit,id FROM shares where from='".$nick."' and shareit 
REGEXP 'youtube|dailymotion|vimeo' ORDER BY id DESC

2 个答案:

答案 0 :(得分:2)

REGEXP匹配总是比直接相等比较慢。例如,构成mysql的正则表达式解析的代码量:MySQL Open Source Regex Code

看看做正则表达式需要什么,并考虑以这种方式进行操作的复杂性。额外参考:https://softwareengineering.stackexchange.com/questions/122440/how-do-regular-expressions-actually-work

当进行直接相等比较时,可以进行更多优化,并且操作成本更低。

正则表达式要慢多少?那是主观的。您可以运行一些基准测试并选择对您有意义的解决方案。有时您需要正则表达式的复杂性,而且成本可以忽略不计。

在我看来,如果您要进行完全匹配,请进行额外输入,然后选择:

SELECT shareit,id FROM shares where from='".$nick."' and 
(shareit = 'youtube' OR shareit = 'dailymotion' OR shareit = 'vimeo') 
ORDER BY id DESC

如果您没有寻找完全匹配,请使用Gordon Linoff的答案中的类似查询。另外需要注意的是,您要比较的列上的索引将是性能提升的最佳选择。

答案 1 :(得分:2)

这是您的查询:

SELECT shareit, id
FROM shares 
WHERE from = '".$nick."' and
      shareit REGEXP 'youtube|dailymotion|vimeo'
ORDER BY id DESC;

正则表达式遵循LIKE的不同规则。因此,您的查询等同于:

SELECT shareit, id
FROM shares 
WHERE `from` = '".$nick."' and
      (shareit LIKE '%yourtube%' OR
       shareit LIKE '%dailymotion%' OR
       shareit LIKE '%vimeo%'
      )
ORDER BY id DESC;

LIKE模式开头使用通配符意味着索引不能用于比较的那一部分。该查询可以使用shares(from)上的索引。

哪个更快,likeregexp?老实说,查询的大部分工作都是获取行。比较可能具有可比性。一个可能比另一个快一点,但这是一个边际考虑因素。

如果您想要完全匹配,那么查询将是:

SELECT shareit, id
FROM shares 
WHERE from = '".$nick."' and
      shareit IN ('youtube', 'dailymotion', 'vimeo')
ORDER BY id DESC;

对于此查询,shares(from, shareit)上的索引绝对优于REGEXP版本。