2012-01-05 60 views
0

问题是,如何提高MySQL REGEXP搜索?

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

其他你想要的? – diEcho 2012-01-05 19:09:39

回答

3

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

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

select tweet from tweets where first4AThruF = true; 

,这应该是相当活泼。

其他可能的考虑是全文查询或LIKE子句,虽然在上面提到的情况下,我不指望它们工作的很好。

+0

“对于所有的意图和目的,正则表达式都是不可能索引的”< - 好吧,是的,除非在这种情况下,正则表达式确定第一个字符只能是一个集合中的一个,这是与特定模式的情况。这是一个非常常见的正则表达式引擎优化,我相信MySQL有这个。 – fge 2012-01-05 21:26:58

+0

你确定吗?我不会。它肯定没有在文档或'regex(7)'页面中提到。您需要将文本搜索优化器与表搜索优化器连接起来,并考虑到这种情况的复杂性以及少数可能有用的情况,我真的怀疑MySQL中的编码器是否做过类似的事情。 – 2012-01-05 21:49:51

+0

我很确定 - http://regex.info – fge 2012-01-05 22:04:13

1

如果你正在寻找搜索是一个字符串的开始,你可以像使用作为高层次的过滤器,然后用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}$'; 

尽管是一个有点令人费解,这应该快很多。