统一和简化MySQL命令

时间:2018-04-27 02:37:39

标签: mysql sql

我做了一些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;

1 个答案:

答案 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子句。

但在我们合并这些之前,我们需要解释在第一个SETUPDATE语句中执行的操作是否会影响第二个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