如何最小化mySQL选择查询的时间?

时间:2014-03-09 01:34:11

标签: mysql sql select sql-optimization

我有这个查询,其中我想查找当年的销售额和去年的销售额。我不能将它分成2个单独的查询,因为它必须是相同的项目代码。这意味着当年销售中使用的物料代码也必须是去年销售所用的物料代码。

以下代码正常运行,但需要大约8到9分钟才能获取

select p.itemcode, 
       p.itemdescription, 
       (  select round((SUM(SA.QUANTITY*P.SellingPrice)),2) 
          from sales s 
          join product p on s.itemcode=p.itemcode 
          where YEAR(s.date) = 2013
       ),       
       (  select round((SUM(SA.QUANTITY * P.SellingPrice)),2) 
          from sales s 
          join product p on s.itemcode=p.itemcode 
          where YEAR(s.date) = 2012
       )
from product p 
join supplier s on p.suppliercode = s.suppliercode
join currency c on c.countrycode=s.countrycode
join country co on co.countrycode=c.countrycode
JOIN SALES SA ON SA.ITEMCODE=P.ITEMCODE
where c.countrycode = 'NZ'
group by p.itemcode
limit 10

理想情况下,输出应为

Itemcode    Itemdescription        SalesforCurrentYear    SalesforLastYear
GS771516    BUBBLE PARTY MACHINE   1035300.00             2079300.00
GSNBC-025   X'MAS HOUSE        600612.25              1397163.25
GSNBC-031   BRANDENBURGER TOR      741010.75              1572207.25

谢谢!

3 个答案:

答案 0 :(得分:0)

遵循以下任何步骤

1.您可以解析您的查询。

2.删除多余的陈述。

3.使用内连接或外连接。

答案 1 :(得分:0)

你在同一范围内销售了三次。我将摆脱其中的两个,这应该有所帮助。此外,就业务逻辑而言,所有这些表似乎都是强制销售的。如果这是真的,你应该使用“内连接”,以便与标准SQL兼容 - 即使它在MySQL中是相同的。

答案 2 :(得分:0)

通过消除两个连接可以简化查询:

select .......
       .......
from product p 
join supplier s on p.suppliercode = s.suppliercode
JOIN SALES SA ON SA.ITEMCODE=P.ITEMCODE
where s.countrycode = 'NZ'
group by p.itemcode
limit 10

之后,select子句中的两个从属子查询可以简化为一个外连接:

select p.itemcode, 
       p.itemdescription, 
       round((SUM(  CASE WHEN YEAR(s.date) = 2013
                    THEN SA.QUANTITY*P.SellingPrice  
                    ELSE 0 END
            )),2) As Sum2013,    
       round((SUM(  CASE WHEN YEAR(s.date) = 2012
                    THEN SA.QUANTITY * P.SellingPrice
                    ELSE 0 END
            )),2) As Sum2012
from product p 
join supplier s on p.suppliercode = s.suppliercode
LEFT JOIN SALES SA ON SA.ITEMCODE=P.ITEMCODE
where s.countrycode = 'NZ'
group by p.itemcode
limit 10

请尝试此查询,并告诉我们它的效果。