Как я могу оптимизировать этот запрос, который в настоящее время использует RLIKE с границами слова? - PullRequest
1 голос
/ 06 марта 2012

Когда я выполняю поиск на своем сайте, я хочу выполнить поиск в трех столбцах поисковой фразы. Поскольку я не хочу, чтобы поиск «Джон» возвращал «Джонсон», в настоящее время я использую RLIKE с границами слова. Однако в моей таблице более 400 000 строк, и этот запрос очень медленный. Кто-нибудь может придумать более быстрый способ сделать то же самое?

Вот мой запрос:

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

1 Ответ

2 голосов
/ 06 марта 2012

Если вы ищете целое слово, гораздо лучшим решением будет использование индекса FULLTEXT.Итак, ваша таблица должна быть MyISAM (если это не так, создайте одну таблицу, которую вы будете использовать только для поиска, и установите связь между ней и вашей таблицей) ... затем создайте индекс FULLTEXT для столбцов, которые вы ищете,и сделайте запрос, подобный этому:

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

..., который действительно повысит вашу производительность.

Вы можете найти хорошее начало здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...