gpt4 book ai didi

mysql - 通过使用临时造成分组;使用文件排序

转载 作者:行者123 更新时间:2023-11-29 20:57:06 25 4
gpt4 key购买 nike

我最近有一个旧项目需要维护(我不是一个经验丰富的开发人员),我发现了这样的 SQL:

SELECT
g.goods_id, o.order_status,
SUM(IF(o.shipping_status=0, g.quantity, 0)) AS 'pending',
SUM(IF(o.shipping_status=3, g.quantity, 0)) AS 'picking',
SUM(IF(o.shipping_status=5, g.quantity, 0)) AS 'shipping'
FROM
order_info AS o
LEFT JOIN
order_goods AS g ON g.order_id = o.order_id
WHERE o.order_status in (1,5,6)
GROUP BY g.goods_id

我删除了一些烦人的东西,所以看起来干净多了。但我还是花了大约 10 秒才得到结果。
该数据库只有 6 万行记录。并且它具有所需的所有索引。
并且解释命令显示该SQL是'Usingtemporary;使用文件排序'。我认为“group by”子句导致了这个问题。
所以我想知道是否可以用另一种方式优化或重写它。这将为我提供相同的功能,并且都避免额外的排序。
任何帮助将不胜感激,并对我糟糕的英语感到抱歉。

order_goods 的索引:
order_id、goods_id...

order_info 的索引:
order_id、order_status、shipping_status...

解释输出在这里:

enter image description here

最佳答案

我建议改变

WHERE o.order_status in (1,5,6)

对于

WHERE (o.order_status = 1 OR o.order_status = 5 OR o.order_status = 6)

不应该改变太多......但我知道在某些 mysql 版本中相当慢,还取决于两个表中的记录。

您还可以更改 select 语句中的 if,而不是在每行中执行 if,您可以在 where 中使用它,仅获取状态为 0,3,5 的行并按运输状态添加组。

AND (o.shipping_status = 0 OR o.order_status = 3 OR o.order_status = 5)

所有句子连续

SELECT
g.goods_id, o.order_status,
SUM(g.quantity) AS 'quantity'
FROM
order_info AS o
LEFT JOIN
order_goods AS g ON g.order_id = o.order_id
WHERE (o.order_status = 1 OR o.order_status = 5 OR o.order_status = 6) AND
(o.shipping_status = 0 OR o.shipping_status = 3 OR o.shipping_status = 5)
GROUP BY g.goods_id,o.shipping_status

请注意,您不会得到与预期相同的结果,但我认为这是获得结果的最快方法,也许更改一些代码并不难。

尝试执行这个,让我们看看时间如何;)

关于mysql - 通过使用临时造成分组;使用文件排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37540917/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com