Альтернативный синтаксис полнотекстового поиска MySQL - PullRequest
0 голосов
/ 11 февраля 2010

Если вы хотите, чтобы релевантность, а также результаты сортировались по релевантности, общий формат запроса FULLTEXT:

SELECT name, MATCH(name) AGAINST('Bob') AS relevance FROM users WHERE MATCH(name) AGAINST('Bob')

Как разработчик, мне всегда нравится делать мой код СУХИМ (не повторяйте себя). Есть ли причина не писать запрос как:

SELECT name, MATCH(name) AGAINST('Bob') AS relevance FROM users HAVING relevance > 0 ORDER BY relevance DESC

Кажется, он возвращает те же результаты, но стоит ли мне беспокоиться о том, что ORDER BY приведет к замедлению запроса? Эти запросы эквивалентны?

Задание MATCH() дважды не снижает производительность, как отмечено в руководстве по MySQL.

Полнотекстовый поиск на естественном языке

Чтобы достичь этого результата, вы должны укажите MATCH() дважды: один раз в SELECT список и один раз в WHERE пункт. Это не вызывает никаких дополнительных накладные расходы, потому что оптимизатор MySQL замечает, что два MATCH() звонка идентичен и вызывает полный текст Искать код только один раз.

1 Ответ

1 голос
/ 11 февраля 2010

К сожалению, согласно документации MySQL SELECT , «предложение HAVING применяется почти в последнюю очередь, непосредственно перед отправкой элементов клиенту без оптимизации.»

Разница в том, что первый запрос будет использовать полнотекстовый индекс для вычисления релевантности только для строк, которые имеют 'Bob' в name. Второй запрос вычислит релевантность для всех строк, а затем выбрасывает большинство из них (возможно, после сортировки всей таблицы). Поэтому второй запрос значительно медленнее. Даже если вы поместите предложение ORDER BY в первый запрос, оно все равно будет быстрее, чем использование HAVING:

SELECT name, MATCH(name) AGAINST('Bob') AS relevance
FROM users
WHERE MATCH(name) AGAINST('Bob')
ORDER BY relevance DESC

Как правило, «не используйте HAVING для элементов, которые должны быть указаны в предложении WHERE».

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