mysql, как% запрос, работает медленно с полнотекстовым индексом

#mysql #sql #search #text

Вопрос:

Я использую простой mysql-ПОДОБНЫЙ запрос, подобный этому:
SELECT * FROM myTable WHERE field LIKE 'aaa%' ORDER BY field2

У меня есть полнотекстовый индекс на «поле», и все равно он очень медленный. Я понял, что есть возможность использовать match. В чем разница? Как? Каков наилучший подход для моего использования? Обратите внимание, что я использую «%» для всего, что начинается с «ааа».

ОБНОВЛЕНИЕ: В итоге я использовал что-то вроде этого: SELECT
*, MATCH (name) AGAINST ('a*' IN BOOLEAN MODE) AS SCORE
FROM
users
WHERE
MATCH (name) AGAINST ('a*' IN BOOLEAN MODE)
ORDER BY SCORE, popularity DESC LIMIT 4

Одна вещь, которую я хотел бы изменить, заключается не в том, чтобы упорядочивать сначала по БАЛЛАМ, а затем по популярности моего поля, а вместо этого упорядочивать с помощью простой весовой функции, что-то вроде 0,5*БАЛЛА 0,5*популярности. Как?

Ответ №1:

LIKE не использует полнотекстовый индекс. Чтобы использовать полнотекстовый индекс, вы должны использовать match (как вы сказали):

 SELECT * 
FROM myTable 
WHERE MATCH(field) AGAINST ('aaa*' IN BOOLEAN MODE)
ORDER BY field2
 

В Руководстве по MySQL есть обширная глава, посвященная функциям полнотекстового поиска.

Комментарии:

1. Интересный.. У кого-нибудь есть какие-либо эквивалентные запросы для DB2 или sybase? Google не очень помогает.

2. @user606723 ознакомьтесь с этой статьей: Полнотекстовый поиск с помощью текстового поиска DB2

3. Я обновил свой запрос, указав «по порядку». Как я могу это добавить?

4. @Noam так же, как вы сделали бы в своем запросе 😉

5. @Noam ORDER BY (0.5*SCORE 0.5*popularity) на самом деле должен работать