据我所知,使用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代替,但即使如此,我不认为它会工作,给出的特异性。
任何意见是非常感谢。 谢谢