Mysql 如何优化当前使用RLIKE和单词边界的查询?

Mysql 如何优化当前使用RLIKE和单词边界的查询?,mysql,sql,database,Mysql,Sql,Database,当我在我的网站上搜索时,我想在三列中搜索搜索短语。因为我不想搜索“John”返回“Johnson”,所以我目前使用带单词边界的RLIKE。然而,我的表有超过400000行,这个查询非常慢。有人能想出一个更快的方法来做同样的事情吗 我的问题是: SELECT * FROM mytable WHERE ( (accountholder RLIKE '[[:<:]]John[[:>:]]') OR (alternatename RLIKE '[[:<

当我在我的网站上搜索时,我想在三列中搜索搜索短语。因为我不想搜索“John”返回“Johnson”,所以我目前使用带单词边界的RLIKE。然而,我的表有超过400000行,这个查询非常慢。有人能想出一个更快的方法来做同样的事情吗

我的问题是:

SELECT * FROM mytable 
WHERE (
         (accountholder RLIKE '[[:<:]]John[[:>:]]') 
      OR (alternatename RLIKE '[[:<:]]John[[:>:]]')
      OR (payeename RLIKE '[[:<:]]John[[:>:]]')
);
从mytable中选择*
在哪里(
(帐户持有人,如“[[::]]”)
或(可选名称为“[[::]]”)
或(收款人名称,如“[[::]]”)
);

如果您要搜索整个单词,更好的解决方案是使用全文索引。因此,您的表必须是MyISAM(如果不是,请创建一个仅用于搜索的表,并在该表和您的表之间建立关系)……然后,在正在搜索的列上创建全文索引,并进行如下查询:

SELECT * FROM mytable WHERE MATCH (accountholder, alternatename, payeename)
AGAINST ('+John' IN BOOLEAN MODE);
…这将真正提高你的表现


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

只是一个想法,但没有经过测试,所以我不会把它作为一个答案发布:在哪里(concat(accountholder,alternatename,payeename)像“[[::]]”这样做?我所知道的是,如果使用concat,您可能会尝试不为任何accountholder、alternatename和PayeName编制索引,因为这可能会降低性能