优化regex查询

vsikbqxv  于 2021-06-25  发布在  Mysql
关注(0)|答案(3)|浏览(219)

这个问题在这里已经有答案了

针对regexp的mysql优化(3个答案)
四年前关门了。
我有一个mysql查询,我正在尝试优化。我有一个有几十万行的表t,有一个varchar列x(和其他一些列),它被索引,并且有不到1000个不同的值。我试图得到所有与特定正则表达式匹配的不同x。这是一种直截了当的表达方式:

SELECT DISTINCT x 
FROM t
WHERE x REGEXP 'someregexp'

但在使用regexp时,mysql似乎完全忽略了索引,因此需要几秒钟的时间。因为我的不同值的数量非常少,如果查询使用索引获取不同的值,然后使用regex过滤结果,那么处理这个问题应该非常快,但现在似乎不是这样,因为它应该能够在不到一秒钟的时间内运行。
有没有什么方法可以提示mysql查询优化器它可以这样做?

hgtggwj0

hgtggwj01#

方案a:

SELECT x
    FROM t
    GROUP BY x
    HAVING x REGEXP 'someregexp';

(这不需要像子查询方法那样写入和读取临时表。)
方案b:添加 INDEX(x) 并且有一个足够新的mysql版本,这样它就可以跳过索引(注意:这也有助于子查询方法。
方案c:同时做方案a和方案b。

t2a7ltrp

t2a7ltrp2#

或许可以试试这样的方法:

SELECT d.x
FROM (SELECT DISTINCT x FROM t) d
WHERE d.x REGEXP 'someregexp'

通过这种方式,它应该首先进行不同的过滤(对于索引来说是快速的),然后再进行regexp(如果只需要对几个不同的值进行过滤,则是快速的)。

hgb9j2n6

hgb9j2n63#

我不知道mysql是否支持物化视图,也不知道这有多“受欢迎”,因为我担心它们可能会大大减慢对表的更改()。但是,我确实认为您可能会得到一个摘要表,该摘要表保存了您要处理的不同值,并在基表上组合了几个触发器,这些触发器将维护摘要表(在insert时,您只需在摘要表中添加尚未添加的内容;在delete时,您必须检查是否删除了最后一个内容,如果是,是否也将其从摘要表中删除。更新时,您必须检查两者)。
考虑到您已经拥有的索引,这应该不会太麻烦,而且由于在该摘要表中只有大约1000个值,我希望regexp也会快得多。
:这在很大程度上取决于它的“智能”程度,如果您的“视图”随着对基表的每次更改而完全刷新,那么我怀疑这是否可以接受)

相关问题