2012-03-06 23 views
1

当我在我的网站上进行搜索时,我想搜索三列搜索词组。因为我不想搜索“约翰”来返回“约翰逊”,所以我目前使用带有单词边界的RLIKE。但是,我的表有超过400,000行,这个查询非常慢。任何人都可以想到更快的方法来做同样的事情吗?我该如何优化当前使用RLIKE和词边界的查询?

这里是我的查询:

SELECT * FROM mytable 
WHERE (
     (accountholder RLIKE '[[:<:]]John[[:>:]]') 
     OR (alternatename RLIKE '[[:<:]]John[[:>:]]') 
     OR (payeename RLIKE '[[:<:]]John[[:>:]]') 
); 
+0

只是一个想法,但没有测试,所以我不会发布它作为答案:将“哪里(concat(accountholder,alternatename,payeename)RLIKE'[[:<:]]John[[:>:]]')”的窍门? 我所知道的是,如果你使用concat,你可能会尝试不索引任何账户持有者,替代名称,payeename,因为它可能会降低性能 – JScoobyCed 2012-03-06 02:50:02

回答

2

如果你正在寻找一个整体的话,更好的解决办法是使用FULLTEXT索引。所以,你的表必须是MyISAM(如果它不是,创建一个表,你只用于搜索并在该表和表之间建立关系)......然后,在你正在搜索的列上创建FULLTEXT索引,并做出这样的查询:

SELECT * FROM mytable WHERE MATCH (accountholder, alternatename, payeename) 
AGAINST ('+John' IN BOOLEAN MODE); 

......这将真正提高您的表现。

你可以找到一个好的开始here