如何改进MySQL REGEXP搜索?
问题是 1.如何利用如何改进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}$';
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
会让它更快吗?如果是,我应该使用什么类型的索引最好的办法是减少结果集,以便在求值之前对正则表达式求值。无论出于何种目的,正则表达式都不可能进行索引 如果我必须想出一种方法来实现这一点,我将检查通常搜索的模式,并在插入时以某种不灵活的方式标记它们。例如,如果您使用
^[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的编码人员是否做过类似的事情。