據我所知,使用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
領域,雖然索引建立在name
和venue
字段。 ,搜索需要我曾經想過改變我的搜索引擎使用類似的Solr代替,但即使如此,我不認爲它會工作,給出的特異性。
任何意見是非常感謝。 謝謝