[英]how to improve MySQL REGEXP search?
问题是
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}$
表达式来搜索大量内容,则我将在布尔值列first4AThruF
创建一个布尔列,并在插入/更新触发器上根据是还是将列更新为true或false它不匹配正则表达式。 如果我索引了first4AThruF
列,并且该列具有足够的选择性,则可以编写查询:
select tweet from tweets where first4AThruF = true;
这应该是很活泼的
其他可能要考虑的是全文查询或LIKE子句,尽管在上述情况下,我认为它们不能很好地工作。
如果您要搜索的是字符串的开头,则可以将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}$';
尽管有点令人费解,但这应该要快得多。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.