mysql - 我可以在 MySQL 中组合两个更新查询以使其更快吗?

标签 mysql sql

现在我正在使用 PHP 运行这两个查询:

UPDATE members SET balance = balance - $cost WHERE id = '$member'");
UPDATE campaigns SET h_hits = h_hits + 1, 
                    d_hits = d_hits + 1, 
                    traffic = traffic + 1, 
                    spent = spent + $cost, 
                    timestamp = CURRENT_TIMESTAMP 
WHERE id = '$row_id'

我看到了一些有关运行多个更新的问题,但大多数问题似乎共享相同的 WHERE 语句,而我的需要使用不同的语句:/

这是我的两个问题:

  1. 如何将这些合并到一个查询中?
  2. 最重要的是,将其作为单个查询运行而不是作为两个单独的查询运行会更快吗?

最佳答案

您可以使用CROSS JOIN组合它们,这不需要两个表中的行之间有任何关系。您可以在 WHERE 子句中指定每个表的条件。

UPDATE members AS m
CROSS JOIN campaigns AS c
SET m.balance = m.balance - $cost,
    c.h_hits = c.h_hits + 1, 
    c.d_hits = c.d_hits + 1, 
    c.traffic = c.traffic + 1, 
    c.spent = c.spent + $cost, 
    timestamp = CURRENT_TIMESTAMP 
WHERE c.id = '$member'
AND m.id = '$row_id'

这是否比执行两个查询更好很难预测,因为这取决于许多因素,例如客户端和数据库服务器之间的连接延迟。如果它们在同一台机器上,我怀疑不会。您应该对这两种方法进行基准测试,以确定哪种方法最适合您的情况。

如果您要进行许多这样的查询,那么准备一次查询,然后使用不同的参数执行它们应该可以提高性能,因为查询只需要在准备时进行解析。

关于mysql - 我可以在 MySQL 中组合两个更新查询以使其更快吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56027845/

相关文章:

SQL从给定日期减去3个工作日

PHP 不向 MYSQLi 中插入数据

Mysql:允许Null的意思

mysql - 创建事件冲突

mysql - (Mysql : SELECT first number not taken in series of numbers, 类似于 MAX()

mysql - SQL 更新替换时出错

sql - 在 Snowflake 中使用嵌套窗口函数

c# - 如何从 C# Windows 应用程序向 PHP 服务器发送包含对象数组的 POST 请求?

php - 是否在插入/更新之前验证数据?

sql - 您会考虑使用 MS SQL Server Management Studio 的替代方案吗?