我做了一些MySQL命令,但执行起来有点慢,因为有三个命令同时执行。
如何在一个命令中统一所有内容并简化代码以使其更快?
UPDATE bidbutler b
LEFT JOIN auction a on b.auc_id=a.auctionID
LEFT JOIN auc_due_table c on b.auc_id=c.auction_id
SET b.butler_status=0
WHERE b.auc_id=a.auctionID
AND b.auc_id=c.auction_id
AND b.butler_status<>0
AND a.auc_status=3
AND c.auc_due_price<>a.auc_final_price
AND c.auc_due_time=a.total_time;
DELETE t1
FROM won_auctions t1
LEFT JOIN auc_due_table t2 ON t1.auction_id = t2.auction_id
LEFT JOIN auction t3 ON t1.auction_id = t3.auctionID
WHERE t1.auction_id = t2.auction_id
AND t1.auction_id = t3.auctionID
AND t2.auc_due_price<>t3.auc_final_price
AND t2.auc_due_time=t3.total_time
AND t3.auc_status=3;
UPDATE auction a
LEFT JOIN auc_due_table b on a.auctionID=b.auction_id
SET a.auc_status=2
WHERE a.auc_status=3
AND a.auctionID=a.auctionID
AND b.auc_due_price<>a.auc_final_price
AND b.auc_due_time=a.total_time;
这三个命令将通过数据库程序同时执行,数据库程序由事件每秒执行一次。
NEW DELETE UPDATED:
DELETE t1
FROM won_auctions t1
JOIN auction t2
ON t1.auction_id = t2.auctionID
LEFT JOIN auc_due_table t3
ON t3.auction_id = t1.auction_id
AND t3.auction_id = t2.auctionID
AND t3.auc_due_price<>t2.auc_final_price
AND t3.auc_due_time=t2.total_time
WHERE t2.auc_status=3;
答案 0 :(得分:1)
序言
重复我留下的评论作为对这个问题的评论,因为我不确定是否有足够的重点放在这些方面:
“我认为这种缓慢不是由三个单独的陈述引起的。”
“看起来这些语句有可能在很多行中流失,即使已经定义了适当的索引。”
“使用EXPLAIN查看执行计划,并确保使用合适的索引,......”
<强>答案强>
DELETE
语句不能与UPDATE
语句组合使用。 SQL不能那样工作。
如果两个UPDATE
语句访问相同的行,并且条件相同,并且第二个UPDATE
不依赖于前面的{{1},则可以将它们组合在一起。 }和UPDATE
语句。
我们看到第一个DELETE
语句需要来自UPDATE
表的匹配行。第二个bidbutler
语句没有这样的要求。
我们注意到UPDATE
子句中的谓词否定了LEFT JOIN的“外部性”。如果原始语句正确实现(并且正在执行所需操作),那么我们可以删除WHERE
关键字。)
我们还发现条件LEFT
可归结为a.auctionID=a.auctionID
。我们已经有其他条件要求a.auctionID IS NOT NULL
为非NULL。 (为什么这个条件包含在声明中?)
我们还看到重复的条件:a.auctionID
子句和b.auc_id=c.auction_id
子句中出现ON
。这种情况只需要指定一次。 (为什么写得那样?也许其他意图?)
可以将第一个WHERE
语句重写为等效语句:
UPDATE
第二个UPDATE auction a
JOIN auc_due_table d
ON d.auction_id = a.auctionID
AND d.auc_due_time = a.total_time
AND d.auc_due_price <> a.auc_final_price
LEFT
JOIN bidbutler b
ON b.auc_id = a.auctionID
AND b.auc_id = d.auction_id
AND b.butler_status <> 0
SET b.butler_status = 0
WHERE a.auc_status = 3
语句可以重写为等效语句:
UPDATE
区别在于UPDATE auction a
JOIN auc_due_table d
ON d.auction_id = a.auctionID
AND d.auc_due_time = a.total_time
AND d.auc_due_price <> a.auc_final_price
SET a.auc_status = 2
WHERE a.auc_status = 3
表的额外外连接和bidbutler
子句。
但在我们合并这些之前,我们需要解释在第一个SET
或UPDATE
语句中执行的操作是否会影响第二个DELETE
语句。 (如果我们以不同的顺序运行这些语句,我们会得到不同的结果吗?)
一个简单的例子来说明我们试图揭示的依赖类型:
UPDATE
在该示例中,我们看到结果(可能)取决于语句的执行顺序。第一个UPDATE foo SET foo.bar = 1 WHERE foo.bar = 0;
DELETE foo.* FROM foo WHERE foo.bar = 0;
UPDATE foo SET foo.qux = 2 WHERE foo.bar = 1;
语句将修改UPDATE
不会删除的行。如果我们首先运行DELETE
,那将删除本已更新的行...执行语句的顺序会影响结果。
回到问题中的原始陈述。我们看到DELETE
列已设置,但也是同一列的条件。
如果语句之间没有依赖关系,那么我们可以将两个auc_status
语句重写为一个语句:
UPDATE