2013-05-14 65 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:]]"[[:>:]]將詞和標點符號之間的匹配。