【发布时间】:2017-09-28 09:09:54
【问题描述】:
我编写了一个带有连接和子查询的查询。它的执行需要 2 分钟。优化不了怎么办?有什么建议吗?
select oli.*,oli2.* from order o
LEFT JOIN order_line_item oli ON oli.order_id = o.id
LEFT JOIN order_line_item oli2 ON oli2.id
= (SELECT oli3.id FROM order_line_item oli3
WHERE oli3.order_id = o.id
AND oli.code = oli3.alternative
GROUP BY oli3.code, o.id
LIMIT 1) WHERE o.store_id != 100 GROUP BY oli.code, oli2.code, o.id
我的子查询可以正常工作,但需要花费太多时间。实际上,它找到了替代产品。如何优化我的子查询?
【问题讨论】:
-
请为您的查询中涉及的所有表提供
SHOW CREATE TABLE <tablename>输出。 -
还有,有必要选择
*吗?如果您不需要所有列,则可能会根据我们从您的表结构(评论上方)中了解到的内容以及您确实需要的列进行改进。 -
因为
*,这听起来像是对GROUP BY的无效使用。 -
请用英文解释查询的目的。 (这个查询太复杂了,我无法理解。我认为可能有更简单的方法来处理它。)
-
认为有订单。该订单有 11 个项目(产品)存储在订单行项目表中。一种产品已完成,系统具有该成品的替代产品。我必须分别计算给客户的产品数量和替代产品的数量。产品的alternated_to 列分配给替代产品的代码。所以我使用了oli.code = oli3.alternative。它工作正常,但我的子查询花费了太多时间@RickJames
标签: mysql subquery query-optimization