使用left join和sum加速mysql查询

时间:2015-10-24 20:11:25

标签: mysql left-join aggregate-functions query-performance

我尝试清理一个目前获得所有产品的非常糟糕编码的网站,然后在每个产品上运行查询,如果计数大于0则从第二个表获取库存计数然后如果有结果回显了产品页面。

因此,在清理其他混乱的时候,我做了一个查询(有3个单独的查询,它们都做了同样的事情只是不同的变量)并且停止需要在页面上运行300多个mysql查询我添加了他剩下的总和加入表库存列,以便我可以访问它以检查它是否超过0。

然而,这似乎比运行数百个单独的查询慢了3倍。

服务器不是很好,因此在MySQL负载下因MySQL问题而死亡。但是,虽然我认为运行较少的查询会导致执行时间更长的问题。

有没有办法让其他表加入列的总和不会让我失望?

查询

以下是长查询的示例:

SELECT p.Product_Name, 
       p.Product_Price, 
       sum( i.Current_Stock ) AS Current_Stock 
FROM Products p LEFT JOIN 
                Items i ON p.Product_Name = i.Product_Name 
GROUP BY p.Product_ID 
ORDER BY p.Product_ID DESC

简短查询是:

SELECT * 
FROM Products 
ORDER BY Product_ID DESC

每个查找Items表库存的产品进行第二次查询:

SELECT * 
FROM Items 
WHERE Product_Name = 'Shirt' 
 AND  Current_Stock > 0

然后我会检查查询是否有效或mysql_numrows是否返回0,并根据该产品的任何选项是否有库存来跳过或回显产品。

产品表

Product_ID | Product_Name 
-------------------------
1          | Shirt
2          | Trousers
3          | Dress

项目表

Item_ID    | Product_Name | Option | Current_Stock
-----------------------------------------
1          | Shirt        | Small  | 0
2          | Shirt        | Medium | 2
3          | Shirt        | Large  | 1

1 个答案:

答案 0 :(得分:0)

您的第一个查询从两个表中收集行,以创建所有组合内容的临时表。然后你的GROUP BY缩小了它。为了避免这种膨胀 - 放气:

SELECT  p.Product_Name, p.Product_Price, 
      ( SELECT  sum( i.Current_Stock )
            FROM  Items i
            WHERE  p.Product_Name = i.Product_Name 
      ) AS Current_Stock
    FROM  Products p
    ORDER BY  p.Product_ID DESC