2010-11-20 2 views
0

У меня есть таблица из 2 + миллионов (строк) продуктов с 44 полями (столбцами). Я пытаюсь запросить эту таблицу на основе поля «NAME» (varchar 160), на котором у меня включен полнотекстовый индекс.SQL Match Against Slow Query

Вот запрос, который выполняет 71.34 секунды для выполнения с помощью трех словного ключевого слова: 62.47 секунд с двумя словами $ keyword и 0.017 секунд для выполнения одним словом $ keyword.

SELECT ID, 
     MATCH(NAME) AGAINST ('$keyword') as Relevance, 
     MANUFACTURER, 
     ADVERTISERCATEGORY, 
     THIRDPARTYCATEGORY, 
     DESCRIPTION, 
     AID, 
     SALEPRICE, 
     RETAILPRICE, 
     PRICE, 
     SKU, 
     BUYURL, 
     IMAGEURL, 
     NAME, 
     PROGRAMNAME 
    FROM products 
    WHERE MATCH(NAME) AGAINST ('$keyword' IN BOOLEAN MODE) 
GROUP BY NAME 
    HAVING Relevance > 6 
ORDER BY Relevance DESC LIMIT 24 

Как я могу оптимизировать этот запрос, чтобы лучше выполнять поиск по ключевым словам 2+ слов $?

+0

Устранение предложения «GROUP BY NAME» улучшает производительность примерно на 4 раза. Сейчас ситуация намного быстрее, но я проведу Sphinx для дальнейшего улучшения. Благодаря! – user514731

ответ

1

Это может быть не совсем ответ, который вы искали, однако:

С таблицей, большие, полнотекстового поиска никогда не собирается быть быстрым. Я бы предложил посмотреть в полнотекстовом движке, например Sphinx.

В качестве дополнительной выгоды вы также можете выполнить сопоставление релевантности в Sphinx, так как оно вернет результаты, оцененные по порядку релевантности. После того, как Sphinx вернет соответствующие идентификаторы, вы можете просто указать инструкцию IN в предложении WHERE вашего запроса и выбрать другие необходимые вам данные.

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

0

Есть table partioning вариант с MySQL? Что касается SQL Server, то в этой ситуации это полезно.

Или, возможно, изменение функции MATCH для стандарта WHERE ... LIKE. Я не знаю о MySQL, поэтому боюсь, что мне будет меньше. Сожалею!