【问题标题】:which query consumes less resources an update or a select哪个查询消耗更少的资源更新或选择
【发布时间】:2021-12-27 21:39:27
【问题描述】:

在某些情况下,我需要在 SQL 中进行更新。 它是表中单个元素的更新。 这些选项中的哪一个会消耗更多资源。

  1. 首先通过选择询问是否需要更新,然后进行更新或
  2. 执行查询以便执行更新,尽管在某些情况下它会覆盖相同的值。

【问题讨论】:

  • 您预计在SELECT 之后必须多久执行一次UPDATE?您是否对您的陈述进行了剖析以查看每种方法的逻辑成本和时间成本?更广泛地说,你为什么要问?分析是否将其作为您系统的瓶颈突出显示?听起来你可能是prematurely optimizing 你的系统。

标签: mysql performance optimization


【解决方案1】:
  • 更多查询 --> 花费更多时间。

  • UPDATESELECT 慢,但比 SELECT+UPDATE 快。

  • 如果SELECT 的目的是查看是否需要UPDATE,那么单独执行UPDATE 可能会更好。

  • IODKU (upsert) 是一个检查行是否存在的单个查询,然后插入新行或更新现有行。 (使用PRIMARYUNIQUE 键来确定新的与现有的。)

  • 单个查询是“原子的”。但是SELECT 加上UPDATE 可能需要这四个 命令来避免“竞争条件”:

      START TRANSACTION;
      SELECT ...   FOR UPDATE;
      UPDATE  ...;
      COMMIT;
    

【讨论】:

    【解决方案2】:

    还有第三种选择:有选择地进行更新。

    例如,假设您想将余额减少一个金额,但前提是余额大于该金额。

    您可以创建这样的查询:

    UPDATE myTable SET balance = balance - :amount 
       WHERE accountID = :accountId AND balance >= :amount
    

    然后检查 ROW_COUNT() 看更新是否成功。 (PHP等语言对此有特定的功能)

    这具有避免 SELECT - UPDATE 方法中隐含的竞争条件的特定好处。

    【讨论】:

    • 类似于“rows_affected”。
    【解决方案3】:

    您的选项 1 中存在时间间隔。 理论上可以选择找不到问题-然后其他人进行更新-然后您进行更新认为它是安全的..

    选项 2 没有这个问题。

    【讨论】:

    猜你喜欢
    • 2012-01-09
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    • 1970-01-01
    • 2013-04-17
    • 2014-08-23
    • 1970-01-01
    相关资源
    最近更新 更多