【发布时间】:2015-10-24 20:11:24
【问题描述】:
我尝试清理一个编码非常糟糕的网站,该网站目前获取所有产品,遍历 hem,然后对每个产品运行查询以从第二个表中获取库存计数,如果计数大于 0,那么如果有结果与页面上的产品相呼应。
因此,在清理其他混乱的同时,我做了一个查询(有 3 个单独的查询,它们都做同样的事情只是不同的变量)并且不再需要在页面上运行 300 多个 mysql 查询,我添加了他离开的总和加入表 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
然后我检查查询是否有效,或者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
【问题讨论】:
-
为了帮助您优化查询,我们需要查看查询和表定义,包括索引。通常明智地选择索引和重构查询可以产生巨大的性能差异。
-
抱歉,添加了简化的表结构和查询,没有用于过滤类别和排序的所有 where 子句。
-
抱歉,简化的表结构和查询不会帮助任何人帮助您。对查询的微小更改有时会产生巨大的差异。您将需要发布原件以及 EXPLAIN 的输出。我在下面提供了一个答案,它将为您提供部分缓解。有了完整的信息,我或其他人将能够为您提供更好的答案。
标签: mysql left-join aggregate-functions query-performance