Лучший эффективный способ сделать полнотекстовый поиск в MySQL - PullRequest
4 голосов
/ 25 августа 2009

У меня есть 3 таблицы, и я хочу сделать запрос для текстового поля поискового запроса. Мой запрос в настоящее время выглядит примерно так:

SELECT Artist.* FROM Artist, Band, Instrument WHERE MATCH (Artist.name) AGAINST ('mysearchterm') OR MATCH (Band.name) AGAINST ('mysearchterm') OR MATCH (Instrument.name, Instrument.description) AGAINST ('mysearchterm');

Этот запрос занимает слишком много времени для выполнения. Есть ли способ улучшить это? Я что-то не так делаю?

Спасибо

Ответы [ 4 ]

5 голосов
/ 25 августа 2009

Я бы перешел к полнотекстовой поисковой системе вместо того, чтобы пытаться оптимизировать это.

http://www.sphinxsearch.com/about.html

4 голосов
/ 25 августа 2009

MYSQL имеет поддержку полнотекстового поиска, которая даст гораздо лучшую производительность.

http://dev.mysql.com/doc/refman/5.0/en/fulltext-restrictions.html

Тем не менее, я бы порекомендовал использовать систему, предназначенную для полнотекстового поиска, если вы намерены создать значительную нагрузку на ваше приложение.

1 голос
/ 30 октября 2010

Извините за позднее наблюдение, но разве вы не делаете декартово соединение с этими тремя столами?

SELECT Artist.* FROM Artist, Band, Instrument WHERE MATCH (Artist.name) AGAINST ('mysearchterm') OR MATCH (Band.name) AGAINST ('mysearchterm') OR MATCH (Instrument.name, Instrument.description) AGAINST ('mysearchterm');

Предполагается, что база данных с 100 группами, 10 инструментами и 500 исполнителями вы ищете в 500 000 строк.

Я бы ожидал увидеть что-то вроде предположения, что у вас есть база данных, где Artist принадлежит к одной группе и играет на одном инструменте:

SELECT Artist.* FROM Artist, Band, Instrument WHERE Artist.band_id = Band.id and Artist.instrument_id = Instrument.id and (MATCH (Artist.name) AGAINST ('mysearchterm') OR MATCH (Band.name) AGAINST ('mysearchterm') OR MATCH (Instrument.name, Instrument.description) AGAINST ('mysearchterm'));
0 голосов
/ 25 августа 2009

Можете ли вы сделать что-то вроде следующего, что не является полнотекстовым поиском?

SELECT Artist.* FROM Artist, Band, Instrument WHERE Artist.name LIKE '%mysearchterm%'...

Или (мои предпочтения):

SELECT Artist.* FROM Artist, Band, Instrument WHERE Artist.name REGEXP '<regexp here>'...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...