2010-11-20 83 views
0

我有一個包含44個字段(列)的2百萬(行)產品表。 我試圖查詢這個基於'NAME'字段(varchar 160),我有一個全文索引。針對慢查詢的SQL匹配

這是當前正在執行71.34秒,用三個字$關鍵字執行的查詢, 62.47秒用兩個單詞$關鍵字執行並且用一個單詞$關鍵字執行0.017秒。

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倍。事情現在速度更快,但我會檢查出獅身人面像進一步改善。謝謝! – user514731 2010-11-20 22:51:49

回答

1

這可能不是很你尋找答案,但是:

有一張桌子那麼大,全文搜索是永遠不會是迅速的。我建議尋找像Sphinx這樣的全文引擎。

作爲一個附加的好處,你也可以在Sphinx中做相關性匹配,因爲它會返回按相關性順序排列的結果。一旦Sphinx返回匹配的ID,那麼您可以在查詢的WHERE子句中添加一條IN語句並選擇您需要的其他數據。

我還建議查看Sphinx的擴展查詢語法,因爲這樣可以讓您匹配多個詞,如接近度和詞序。

0

table partioning MySQL的一個選項嗎?至於SQL Server,這是一個在這種情況下很有用的揭示。

或者可能更改標準WHERE ... LIKE子句的MATCH函數。我不知道MySQL,所以我擔心幫助不大。抱歉!