问题是,
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}$';
tweet
会让它更快吗?如果是这样,我应该使用什么类型的索引?InnoDB
,还有其他表引擎会变得有益吗? 答案 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}$';
尽管有点复杂,但这应该快得多。