哪个查询消耗更少的资源更新或 select
which query consumes less resources an update or a select
我需要在 SQL 中的某些情况下进行更新。
它是 table 中单个元素的更新。
这些选项中哪个会消耗更多资源。
- 首先询问是否需要通过 select 进行更新,然后进行更新或
- 执行查询以便执行更新,尽管在某些情况下它会覆盖相同的值。
你的选项 1 有时间差。
理论上可能 select 没有发现任何问题 - 然后其他人进行更新 - 然后你进行更新并认为它是安全的..
选项2没有这个问题。
还有第三种选择:有选择地进行更新。
例如,假设您想减少余额,但前提是余额大于金额。
您可以创建这样的查询:
UPDATE myTable SET balance = balance - :amount
WHERE accountID = :accountId AND balance >= :amount
然后检查ROW_COUNT() 看更新是否成功。 (PHP其他语言对此有特定的功能)
这有一个特别的好处,它避免了 SELECT - UPDATE 方法中隐含的竞争条件。
更多查询 --> 花费更多时间。
UPDATE
比 SELECT
慢,但比 SELECT+UPDATE
.
快
如果 SELECT
的目的是查看是否需要 UPDATE
,那么单独执行 UPDATE
可能会更好。
IODKU (upsert) 是一个单一查询,它检查一行是否存在,然后插入新行或更新现有行。 (使用 PRIMARY
或 UNIQUE
键来确定新的还是现有的。)
单个查询是“原子的”。但是 SELECT
加上 UPDATE
可能需要这些 四个 命令来避免“竞争条件”:
START TRANSACTION;
SELECT ... FOR UPDATE;
UPDATE ...;
COMMIT;
我需要在 SQL 中的某些情况下进行更新。 它是 table 中单个元素的更新。 这些选项中哪个会消耗更多资源。
- 首先询问是否需要通过 select 进行更新,然后进行更新或
- 执行查询以便执行更新,尽管在某些情况下它会覆盖相同的值。
你的选项 1 有时间差。 理论上可能 select 没有发现任何问题 - 然后其他人进行更新 - 然后你进行更新并认为它是安全的..
选项2没有这个问题。
还有第三种选择:有选择地进行更新。
例如,假设您想减少余额,但前提是余额大于金额。
您可以创建这样的查询:
UPDATE myTable SET balance = balance - :amount
WHERE accountID = :accountId AND balance >= :amount
然后检查ROW_COUNT() 看更新是否成功。 (PHP其他语言对此有特定的功能)
这有一个特别的好处,它避免了 SELECT - UPDATE 方法中隐含的竞争条件。
更多查询 --> 花费更多时间。
快UPDATE
比SELECT
慢,但比SELECT+UPDATE
.如果
SELECT
的目的是查看是否需要UPDATE
,那么单独执行UPDATE
可能会更好。IODKU (upsert) 是一个单一查询,它检查一行是否存在,然后插入新行或更新现有行。 (使用
PRIMARY
或UNIQUE
键来确定新的还是现有的。)单个查询是“原子的”。但是
SELECT
加上UPDATE
可能需要这些 四个 命令来避免“竞争条件”:START TRANSACTION; SELECT ... FOR UPDATE; UPDATE ...; COMMIT;