【问题标题】:mysql - speedup regexmysql - 加速正则表达式
【发布时间】:2010-03-08 15:50:02
【问题描述】:

我有一张桌子:

+--------+------------------+------+-----+---------+----------------+
| Field  | Type             | Null | Key | Default | Extra          |
+--------+------------------+------+-----+---------+----------------+
| idurl  | int(11)          | NO   | PRI | NULL    | auto_increment |
| idsite | int(10) unsigned | NO   | MUL | NULL    |                |
| url    | varchar(2048)    | NO   |     | NULL    |                |
+--------+------------------+------+-----+---------+----------------+

select 语句是:

SELECT idurl,
       url
  FROM URL
 WHERE idsite = 34
   AND url REGEXP '^https\\://www\\.domain\\.com/checkout/step_one\\.php.*'

在有 1000000 行的表上查询需要 5 秒。 我可以通过索引或其他方式实现加速吗?

【问题讨论】:

    标签: sql mysql regex


    【解决方案1】:

    看起来像一个 LIKE 可能就足够了。 LIKE 使用 % 作为任意数量的字符的通配符。

    AND url LIKE 'https://www.domain.com/checkout/step_one.php%'
    

    LIKE 不需要像 ^ 这样的起始锚点。只有第二个示例匹配:

    'Sherlock and Watson' LIKE 'and%'
    'Sherlock and Watson' LIKE '%and%'
    'Sherlock and Watson' LIKE '%and'
    

    【讨论】:

      【解决方案2】:

      任何涉及 URL 列的索引都可能对您没有帮助,因为数据库引擎仍然需要遍历该列的内容以检查内容是否与正则表达式匹配。

      根据您拥有的 IDSITE 唯一值的数量,对您有帮助的方法是在 IDSITE 上放置一个索引或执行初始选择 WHERE IDSITE = 34,然后将该子查询用作您在 URL 上查询的目标。

      类似:

      select
          idurl,
          url
      from
          (select idurl, url from uwe_url where idsite = 34)
      where
          url REGEXP '^https\\://www\\.domain\\.com/checkout/step_one\\.php.*'
      

      但我很确定您无法绕过 URL 列匹配的文本解析。

      【讨论】:

      • MySQL 知道正则表达式评估比整数比较更昂贵,并且会自己进行优化
      【解决方案3】:

      您可以使用LIKE 运算符代替正则表达式。但由于您的正则表达式很简单,这可能会或可能不会提高性能。

      您可以将域拆分为一个单独的字段,对其进行索引并在 where 子句中使用它。如果您存储的 URL 来自许多不同的域,那么这样的索引可以显着提高性能。

      【讨论】:

      • 由于域是 URL 的起始部分,因此对整个 URL 的索引同样有效。
      【解决方案4】:

      看起来你真的不需要那个 REGEXP。

      这个子句就足够了:

      AND eu.url LIKE 'https://www.domain.com/checkout/step_one.php%'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-05
        • 1970-01-01
        • 2011-10-05
        • 1970-01-01
        • 2011-05-16
        • 2016-01-15
        • 2011-12-24
        • 2013-10-13
        相关资源
        最近更新 更多