使用左连接和求和加速mysql查询
我试图清理一个编码非常糟糕的站点,该站点当前获取所有产品,循环使用hem,然后对每个产品运行查询,以从第二个表中获取库存计数。如果计数大于0,则如果有一个结果与页面上的产品相呼应 所以,在清理其他混乱的时候,我做了一个查询(有3个单独的查询,它们都做相同的事情,只是不同的变量),为了停止在页面上运行300+mysql查询,我添加了一个left joined tables stock列的总和,这样我就可以访问它来检查它是否超过0 然而,这似乎比运行数百个单独的查询慢3倍 服务器不是很好,所以由于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
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的输出。我在下面提供了一个答案,这将为您提供部分缓解。有了完整的信息,我或其他人将能够给你更好的答案。