【问题标题】:Speeding up mysql query with left join and sum使用左连接和求和加速 mysql 查询
【发布时间】: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


【解决方案1】:

您的第一个查询从两个表中收集行,以创建一个包含所有组合内容的临时表。然后您的 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

【讨论】:

    猜你喜欢
    • 2012-06-14
    • 1970-01-01
    • 2012-08-08
    • 2016-10-08
    • 2017-03-08
    • 1970-01-01
    • 2017-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多