gpt4 book ai didi

mysql - 需要一种优化慢速 SQL 查询的方法吗?

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

我正在 mySQL 服务器上运行更新查询/子查询,需要 12 分钟才能完成,我认为它优化不够。

有人可以考虑优化它,让它运行得更快吗?

提前致谢。

UPDATE `TABLE_1` C
INNER JOIN(

SELECT Cust_No,

#current year sales

(SELECT SUM(`Sales`)
FROM `TABLE_2`
WHERE Year = 2016
AND Cust_No = p.Cust_No
) as CY_TOTAL_SALES,

# Get previou year sales

(SELECT SUM(`Sales`)
FROM `TABLE_2`
WHERE Year = 2015
AND Cust_No = p.Cust_No
) as PY_TOTAL_SALES

FROM `TABLE_2` p
WHERE Year >= 2015
AND Year <= 2016

) AS A ON C.`customer_number` = A.Cust_No
SET C.CY_TOTAL_SALES = A.CY_TOTAL_SALES,
C.PY_TOTAL_SALES = A.PY_TOTAL_SALES;

TABLE_1 包含 28,000 条记录(customer_number 字段是唯一的并且已建立索引)

TABLE_2 包含 250,000 条记录(Cust_No 不是唯一的,但已建立索引)

它所做的是通过加入 Table_2 来更新 TABLE_1,并使用子查询对 TABLE_2 中两年的总销售额求和,然后将值更新回 TABLE_1,其中 TABLE_1 客户编号与 TABLE_2 Cust_no 匹配。

最佳答案

我可以想到几个可能的解决方案。

方法一

只做一个子查询,不做任何相关的子查询,并根据年份有条件地求和。

UPDATE TABLE_1 C
INNER JOIN (
SELECT Cust_No,
SUM(IF(Year=2015, Sales, 0)) AS PY_TOTAL_SALES,
SUM(IF(Year=2016, Sales, 0)) AS CY_TOTAL_SALES
FROM TABLE_2
WHERE Year IN (2015, 2016)
GROUP BY Cust_No
) AS S ON C.customer_number = S.Cust_No
SET C.PY_TOTAL_SALES = S.PY_TOTAL_SALES,
C.CY_TOTAL_SALES = S.CY_TOTAL_SALES;

方法二

根本不做子查询。

首先,将所有客户的总销售额归零:

UPDATE TABLE_1 C
SET C.CY_TOTAL_SALES = 0,
C.PY_TOTAL_SALES = 0;

然后在不使用任何子查询或 SUM() 调用的情况下进行连接,并将每个销售数字一次添加到客户的总销售额中。

UPDATE TABLE_1 AS C
INNER JOIN TABLE_2 AS S ON C.customer_number = S.Cust_No
SET C.CY_TOTAL_SALES = C.CY_TOTAL_SALES + IF(S.Year=2016, S.Sales, 0)
C.PY_TOTAL_SALES = C.PY_TOTAL_SALES + IF(S.Year=2015, S.Sales, 0)
WHERE S.Year IN (2015, 2016);

对于这两种解决方案,您都需要 TABLE_2 中列(Cust_No、Year、Sales)的索引。


与此同时,我可以稍微解释一下为什么您的原始查询如此缓慢。您的子查询读取 TABLE_2,您说它有 250,000 行(我假设所有行都在 2015-2016 年),并且它为每一行计算相应客户的总销售额。这意味着它会为每个客户多次计算相同的金额。

您正在运行 500,000 个相关子查询!这实际上是一个奇迹,只需要 12 分钟。

在执行此操作时,由于子查询,它会将整个结果保存在一个 250,000 行的临时表中。

然后它将临时表连接到 TABLE_1,并为每个客户设置 CY_TOTAL_SALES 和 PY_TOTAL_SALES。您不知道,它为每位客户设置了多次相同的总数。

关于mysql - 需要一种优化慢速 SQL 查询的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41154731/

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