2010-03-05 41 views
1

我有一個表產品與產品和表銷售與這些產品上完成的所有銷售操作。這些表由Sales.PRODUCT_ID列連接。如何增加最後一天計數查詢性能

我想今天得到10級最常出售的產品和我所做的是這樣的:

SELECT product.* , COUNT(sale.ID) SUMSELL 
FROM Products product 
LEFT JOIN 
    Sales sale 
    ON 
     sale.ANKIETA_ID = product.ID AND 
     sale.DATE >= DATE_SUB(NOW() , INTERVAL 1 DAY) 
GROUP BY product.ID 
ORDER BY SUMSELL DESC 
LIMIT 0 , 10 

但它的性能非常緩慢。我能做些什麼來提高這個特定查詢的性能?

+0

你有ID和日期索引嗎? – 2010-03-05 17:08:47

回答

1

擺脫LEFT JOIN的:

SELECT product.*, sumsell 
FROM (
     SELECT ankieta_id, COUNT(*) AS sumsell 
     FROM sale 
     WHERE sale.DATE >= DATE_SUB(NOW() , INTERVAL 1 DAY) 
     GROUP BY 
       ankieta_id 
     ) s 
JOIN product 
ON  product.id = s.ankieta_id 
ORDER BY 
     SUMSELL DESC 
LIMIT 10 

sale (date, ankieta_id)指數爲這個快速地工作。

如果有可能,你必須小於10產品爲表出售,但是你窗臺需要顯示10,那麼這樣做:

SELECT * 
FROM (
     SELECT product.*, sumsell 
     FROM (
       SELECT ankieta_id, COUNT(*) AS sumsell 
       FROM sale 
       WHERE sale.DATE >= DATE_SUB(NOW() , INTERVAL 1 DAY) 
       GROUP BY 
         ankieta_id 
       ) s 
     JOIN product 
     ON  product.id = s.ankieta_id 
     ORDER BY 
       SUMSELL DESC 
     LIMIT 10 
     ) p 
UNION ALL 
SELECT * 
FROM (
     SELECT product_id, 0 
     FROM products p 
     WHERE products NOT IN 
       (
       SELECT * 
       FROM sale 
       WHERE ankieta_id = p.id 
         AND sale.DATE >= DATE_SUB(NOW() , INTERVAL 1 DAY) 
       ) p2 
     LIMIT 10 
     ) p2 
ORDER BY 
     sumsell DESC 
LIMIT 10 
0

您使用左側加入了sale.DATE >= DATE_SUB(NOW() , INTERVAL 1 DAY)條件。我想這就是爲什麼它很慢。

我建議:

  • 移動日期條件爲WHERE條款
  • 使用JOIN而不是JOIN
  • 添加和指數Sales.DATE也將有助於縮小查詢

SELECT product.* , COUNT(sale.ID) SUMSELL 
FROM Products product 
JOIN Sales sale 
    ON sale.ANKIETA_ID = product.ID 
WHERE sale.DATE >= DATE_SUB(NOW() , INTERVAL 1 DAY) 
GROUP BY product.ID 
ORDER BY SUMSELL DESC 
LIMIT 0 , 10