如何改进MySQL REGEXP搜索?

时间:2012-01-05 19:07:32

标签: mysql regex performance

问题是,

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

该表格如

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. 索引tweet会让它更快吗?如果是这样,我应该使用什么类型的索引?
  2. 我的表引擎是InnoDB,还有其他表引擎会变得有益吗?

2 个答案:

答案 0 :(得分:3)

最好的办法是在评估之前减少结果集以评估正则表达式。出于所有意图和目的,正则表达式无法索引。

如果我必须想出一个方法,我会检查通常搜索的模式,并在插入时以某种索引方式标记它们。例如,如果您使用^[abcdef]{1,4}$表达式进行大量搜索,我会创建一个布尔列first4AThruF,并在插入/更新触发器上,根据是否更新列为true或false它匹配正则表达式。如果我将first4AThruF列编入索引,并且列具有足够的选择性,我可以编写查询:

select tweet from tweets where first4AThruF = true;

这应该是非常活泼的。

要考虑的其他可能性是全文查询或LIKE子句,尽管在上面提到的情况下我不希望它们运行良好。

答案 1 :(得分:1)

如果您要查找的搜索位于字符串的开头,则可以将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}$';

尽管有点复杂,但这应该快得多。