2010-11-20 46 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,所以我担心帮助不大。抱歉!