使用左连接和求和加速mysql查询

使用左连接和求和加速mysql查询,mysql,left-join,aggregate-functions,query-performance,Mysql,Left Join,Aggregate Functions,Query Performance,我试图清理一个编码非常糟糕的站点,该站点当前获取所有产品,循环使用hem,然后对每个产品运行查询,以从第二个表中获取库存计数。如果计数大于0,则如果有一个结果与页面上的产品相呼应 所以,在清理其他混乱的时候,我做了一个查询(有3个单独的查询,它们都做相同的事情,只是不同的变量),为了停止在页面上运行300+mysql查询,我添加了一个left joined tables stock列的总和,这样我就可以访问它来检查它是否超过0 然而,这似乎比运行数百个单独的查询慢3倍 服务器不是很好,所以由于M

我试图清理一个编码非常糟糕的站点,该站点当前获取所有产品,循环使用hem,然后对每个产品运行查询,以从第二个表中获取库存计数。如果计数大于0,则如果有一个结果与页面上的产品相呼应

所以,在清理其他混乱的时候,我做了一个查询(有3个单独的查询,它们都做相同的事情,只是不同的变量),为了停止在页面上运行300+mysql查询,我添加了一个left joined tables stock列的总和,这样我就可以访问它来检查它是否超过0

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

服务器不是很好,所以由于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
然后我检查查询是否有效,或者是否返回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
项目表

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

第一个查询收集两个表中的行,以生成包含所有组合内容的临时表。然后,您的
分组依据
将其缩小。为避免这种情况,请执行以下操作:

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

欢迎来到SO。请阅读并帮助您优化查询,我们需要查看查询和表定义,包括索引。通常,明智地选择索引和重构查询会产生巨大的性能差异。抱歉,添加了简化的表结构和查询,但没有用于筛选类别和排序的所有where子句。抱歉,简化的表结构和查询对任何人都没有帮助。对一个查询进行一个微小的更改可以在某个时间产生巨大的变化。您将需要张贴原件以及EXPLAIN的输出。我在下面提供了一个答案,这将为您提供部分缓解。有了完整的信息,我或其他人将能够给你更好的答案。