【问题标题】:Unwanted results with REGEXP, MySQL使用 REGEXP、MySQL 的不需要的结果
【发布时间】:2018-04-20 10:13:13
【问题描述】:

我不擅长 REGEX,有人可以帮我优化我的 MySQL 查询吗?

SELECT activity
FROM activity
WHERE (LOWER( activity_name ) REGEXP '>mit|mit,|edited mit')
ORDER BY created_date DESC

当我用'mit|mit,|edited mit' 替换'>mit|mit,|edited mit' 时,它运行得非常快,但它显示了不需要的额外记录。我什至尝试了'/[>]/mit|mit,|edited mit',不幸的是,我得到了错误的结果。

谢谢

【问题讨论】:

  • >mit|mit,|edited mit 应该是^mit|mit,|edited mit
  • 或者:^(mit|mit,|edited mit)。如果您能解释一下您想要匹配的内容、获得的结果以及不想要的结果,将会很有帮助。
  • 不,我写对了,那些是href链接。所以我匹配右尖括号和链接首字母。不过还是谢谢。
  • 坦率地说,您的模式非常理想。如果您删除第一个>,则会出现两个在同一位置匹配的替代方案,这通常会降低性能。您可能想要的是减少替代品的数量,或者完全摆脱它们。如果您尝试过'mit|mit,|edited mit',那么将其写为'mit,?|edited mit' 是有意义的,这意味着您可以将其缩减为'(edited )?mit'。也许只是 LIKE '%mit%' 就足够了吗?
  • @Mitul REGEXP '^<[[:alnum:]]+>[[:blank:]]+[[:alnum:]]+$'

标签: mysql regex


【解决方案1】:

在第二个正则表达式中速度爆发的可能原因是第一个测试已经缓存了东西。你有两次尝试这两个正则表达式吗?

这样应该会好一点:

WHERE activity_name LIKE '%mit%'
  AND LOWER( activity_name ) REGEXP '>mit|mit,|edited mit'

LIKEREGEXP 快,但没有那么强大。因此,LIKE 将过滤掉大部分行,然后REGEXP 将完成过滤。

另一个轻微的加速:如果activity_name 有一个..._ci 排序规则,你就不需要LOWER()

更快的是拥有一个FULLTEXT 索引并执行

WHERE MATCH(activity_name) AGAINST('+mit' IN BOOLEAN MODE)
  AND REGEXP '>mit|mit,|edited mit'

【讨论】:

    猜你喜欢
    • 2011-03-07
    • 2013-01-06
    • 1970-01-01
    • 2012-03-17
    • 1970-01-01
    • 2013-10-26
    • 2021-05-19
    • 1970-01-01
    • 2013-10-21
    相关资源
    最近更新 更多