2010-02-11 7 views
0

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

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.

Natural Language Full-Text Searches

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

ответ

1

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

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

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

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

+0

Я пробовал использовать релевантность WHERE> 0, но затем я получил эту ошибку. Неизвестный столбец «релевантность» в разделе «where» – ejunker

+0

True. Предложение WHERE вычисляется * перед выражением SELECT, поэтому оно не может использовать какие-либо псевдонимы для этих выражений. Предложение HAVING выполняется после, поэтому оно может использовать эти псевдонимы; однако только предложение WHERE позволяет MySQL оптимизировать ненужные вычисления. В этом случае, СУХОЙ или скорость: возьмите свой выбор. – eswald

Смежные вопросы