2013-05-14 100 views
1

据我所知,使用REGEXP有它的缺点,尤其是当它涉及到查询时间,但是,我没有别的选择,除了使用它。MySQL的使用REGEXP造成长时间的查询时间

的问题是,查询可以在5分钟内运行,这取决于很多的搜索字词的使用方式。

我的任务是搜索一个搜索词,并找到确切的搜索词,以及一些单词的变体,如复数,以'ing'结尾,或搜索词后跟任何标点符号,但不是所以“汽车”不应该与“卡宾”或“疤痕”相匹配。 搜索字词的无限数量可以用,但是当数量开始得到上述6,它变得无法忍受长时间。

这里是我的查询的一个示例:

SELECT `id` FROM `table` WHERE (( 
    `name` REGEXP "[[:<:]]sesame street[[:>:]]" OR 
    `name` REGEXP "sesame street[[:punct:]]" OR 
    `name` REGEXP "[[:<:]]sesame street.?ing[[:>:]]" OR 
    `name` REGEXP "[[:<:]]sesame street.?s[[:>:]]" 
) OR ( 
    `venue` REGEXP "[[:<:]]disney[[:>:]]" OR 
    `venue` REGEXP "disney[[:punct:]]" OR 
    `venue` REGEXP "[[:<:]]disney.?ing[[:>:]]" OR 
    `venue` REGEXP "[[:<:]]disney.?s[[:>:]]" 
)) 
AND `name` NOT LIKE "% tantrum %" 
AND `name` NOT LIKE "% stepkids %" 
AND `date` >= CURDATE() 
ORDER BY `date` ASC; 

该查询使用一个表,所以没有表连接的问题。

单个查询可以包含30名不同的关键字可能是要么包括或排除,然后还有那些搜索术语的变化,因此,每个术语可以创建5个不同的条件句。 由于查询使用REGEXP,可以使用的唯一的索引是date领域,虽然索引建立在namevenue字段。 ,搜索需要我曾经想过改变我的搜索引擎使用类似的Solr代替,但即使如此,我不认为它会工作,给出的特异性。

任何意见是非常感谢。 谢谢

回答

0

通过对每个搜索词使用单个表达式而不是现在的四个,您可能可以实现一些改进(达到4的因子)。

而不是使用:

`venue` REGEXP "[[:<:]]disney[[:>:]]" OR 
`venue` REGEXP "disney[[:punct:]]" OR 
`venue` REGEXP "[[:<:]]disney.?ing[[:>:]]" OR 
`venue` REGEXP "[[:<:]]disney.?s[[:>:]]" 

你可以写:

`venue` REGEXP "[[:<:]]disney(.?(s|ing))?[[:>:]]" 

你不需要"disney[[:punct:]]"[[:>:]]将词和标点符号之间的匹配。