如何改进MySQL REGEXP搜索?

如何改进MySQL REGEXP搜索?,mysql,regex,performance,Mysql,Regex,Performance,问题是 1.如何利用REGEXP提高mysql中SELECT查询的性能 这张桌子看起来像 create table `tweets`( `id` bigint auto_increment, `tweet` varchar(140), `time` datetime, primary key(`id`) ); 下面的查询大约需要0.35秒 select tweet from tweets where tweet regexp '^[abcdef]{1,4}$';

问题是

1.如何利用
REGEXP
提高mysql中
SELECT
查询的性能

这张桌子看起来像

create table `tweets`(
    `id` bigint auto_increment,
    `tweet` varchar(140),
    `time` datetime,
    primary key(`id`)
);
下面的查询大约需要0.35秒

select tweet from tweets where tweet regexp '^[abcdef]{1,4}$';
  • 索引
    tweet
    会让它更快吗?如果是,我应该使用什么类型的索引
  • 我的表格引擎是InnoDB,还有其他表格引擎会变得有用吗
    最好的办法是减少结果集,以便在求值之前对正则表达式求值。无论出于何种目的,正则表达式都不可能进行索引

    如果我必须想出一种方法来实现这一点,我将检查通常搜索的模式,并在插入时以某种不灵活的方式标记它们。例如,如果您使用
    ^[abcdef]{1,4}$
    表达式来搜索lot,我将创建一个布尔列
    first4AThruF
    ,并在insert/update触发器上,根据该列是否与正则表达式匹配,将其更新为true或false。如果我为
    first4AThruF
    列编制了索引,并且该列具有足够的选择性,那么我可以编写查询:

    select tweet from tweets where first4AThruF = true;
    
    这应该很有活力


    其他可能考虑的是全文查询或类似的子句,尽管在上面提到的情况下,我不希望它们工作得很好。

    您最好在评估之前将结果集减少到正则表达式进行评估。无论出于何种目的,正则表达式都不可能进行索引

    如果我必须想出一种方法来实现这一点,我将检查通常搜索的模式,并在插入时以某种不灵活的方式标记它们。例如,如果您使用
    ^[abcdef]{1,4}$
    表达式来搜索lot,我将创建一个布尔列
    first4AThruF
    ,并在insert/update触发器上,根据该列是否与正则表达式匹配,将其更新为true或false。如果我为
    first4AThruF
    列编制了索引,并且该列具有足够的选择性,那么我可以编写查询:

    select tweet from tweets where first4AThruF = true;
    
    这应该很有活力


    其他可能考虑的是全文查询或类似的子句,尽管在上面提到的情况下,我并不期望它们工作得很好。

    < P>如果您正在寻找的搜索位于字符串的开头,可以使用类似于高级过滤器,然后再次检查“代码> ReXEP :

    select tweet from tweets 
    where 
        ( 
          tweet LIKE 'a%' OR
          tweet LIKE 'b%' OR
          tweet LIKE 'c%' OR
          tweet LIKE 'd%' OR
          tweet LIKE 'e%'
        )
        AND LENGTH(tweet) <= 4 -- try taking this line out line too
        AND tweet regexp '^[abcdef]{1,4}$';
    
    从tweets中选择tweet
    哪里
    ( 
    像“a%”或
    像“b%”或
    像“c%”或
    如“d%”或
    像“e%”这样的推特
    )
    
    和长度(tweet)如果您要查找的搜索位于字符串的开头,您可以使用LIKE作为高级过滤器,然后使用
    REGEXP
    再次检查:

    select tweet from tweets 
    where 
        ( 
          tweet LIKE 'a%' OR
          tweet LIKE 'b%' OR
          tweet LIKE 'c%' OR
          tweet LIKE 'd%' OR
          tweet LIKE 'e%'
        )
        AND LENGTH(tweet) <= 4 -- try taking this line out line too
        AND tweet regexp '^[abcdef]{1,4}$';
    
    从tweets中选择tweet
    哪里
    ( 
    像“a%”或
    像“b%”或
    像“c%”或
    如“d%”或
    像“e%”这样的推特
    )
    
    而LENGTH(tweet)“正则表达式无论出于何种目的,都不可能为其编制索引”,你确定吗?我不会的。文档或
    regex(7)
    页面中肯定没有提到它。你需要在文本搜索优化器和表搜索优化器之间架起桥梁,考虑到这一点的复杂性和它可能有用的少数情况,我真的怀疑MySQL的编码人员是否做过类似的事情?我不会的。文档或
    regex(7)
    页面中肯定没有提到它。您需要将文本搜索优化器与表搜索优化器连接起来,考虑到这一点的复杂性以及它可能有用的少数情况,我真的怀疑MySQL的编码人员是否做过类似的事情。