【问题标题】:MySQL speed up subquery with sumMySQL 使用 sum 加速子查询
【发布时间】:2017-05-09 16:27:29
【问题描述】:

我需要一个查询来获取实际库存的概览(每个唯一产品 ID 只有一行)以及所有销售和采购订单。现在,我们使用两个子查询(销售订单和采购订单),因为可能有多个销售订单和采购订单。 由于有两个子查询,此查询非常慢。是否有另一种方法来获取销售订单的总和和采购订单的总和,例如常规左连接?

当前查询

SELECT stock.quanity, salesOrders.quantity, purchaseOrders.quantity
FROM stock
LEFT JOIN (
   SELECT product_id, sum(quantity) as quantity
   FROM sales_orders
   GROUP BY product_id
) salesOrders ON stock.product_id=salesOrders.product_id
LEFT JOIN (
   SELECT product_id, sum(quantity) as quantity
   FROM purcahse_orders
   GROUP BY product_id
) purchaseOrders ON stock.product_id=purchaseOrders.product_id

【问题讨论】:

  • 您在stock.product_IDsalesOrders.product_IDpurchaseOrders.Product_ID 上有索引吗?
  • 是的,产品是列有索引。

标签: mysql sql join subquery


【解决方案1】:

如果索引正确,相关子查询可能会更快:

SELECT s.quantity, 
       (SELECT sum(so.quantity) FROM sales_orders so WHERE s.product_id = so.product_id
       ) as sales_quantity ,
       (SELECT sum(po.quantity) FROM purchase_orders po WHERE s.product_id = po.product_id
       ) as purchase_quantity 
FROM stock s ;

为了希望提高性能,您需要在sales_orders(product_id, quantity)purchase_orders(product_id, quantity) 上建立索引。

【讨论】:

  • 这应该是个好主意,但有一个问题:应该有一个声明:po.quantity+stock.quantity
  • 哇,我一直认为这些类型的查询会更慢,因为每个选择将在每条库存记录中运行一次。如果 stock 有 1000 条记录,那么您将运行 2001 次查询与运行 3 次查询的连接。我从来没有意识到加入开销会这么多。如果库存只有几条记录或库存是整体的一个子集,我可以看到它更有效;但如果库存是 100 条记录...我想我需要测试!
  • @xQbert 。 . .在 MySQL 中,假设您有正确的索引,使用相关子查询的聚合可能比使用 joins 更快。注释框的解释太长了。
  • @Stefan。 . .这不是您的问题的一部分,但您可以添加 having 子句。
  • 这个解决方案太棒了!我确实将查询速度从 10 秒缩短到了 1 秒!非常感谢!只是一个小问题:是否可以在字段列表中添加 po.quantity+stock.quantity-so.quantity ?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-30
  • 1970-01-01
  • 2011-04-10
  • 2011-12-21
  • 1970-01-01
相关资源
最近更新 更多