【发布时间】:2012-06-29 16:54:42
【问题描述】:
假设我有一个主键列表,每一行都有一个值需要更新。是不是跑起来比较好:
-- run 10,000 of these queries
UPDATE mytable SET myflag = 1 WHERE id = [each_id]
或者像这样将更新组合成批处理查询:
-- run 100 of these queries, where the IN () list contains about 100 elements
UPDATE mytable SET myflag = 1 WHERE id IN (3, 4, 5, 9, 99, ... 7887 )
100 个 IN () 项的 100 个查询怎么样?
【问题讨论】:
-
做一些基准测试?如果您可以在 您的 系统上对其进行测试,它将是对 您 最准确的
-
这在很大程度上取决于您是否使用事务/每个
UPDATE或大约每 100 个事务等。 -
嗯,测试这个非常容易......但是,只要你的
IN()max_allowed_packet,特别是如果myflag上有一个键,它就是 可能更快。 -
nitpick:第一个案例更新 10k 行,第二个 100k 行,不确定这是不是故意的?
-
如果每次更新单独事务,一次多条记录将在 PostgreSQL 中以压倒性优势获胜,这仅仅是因为事务数量减少。看起来这个长长的数字列表可能包含在某个表中,如果可能,请在 WHERE 子句中对该表使用选择。
标签: mysql performance postgresql sql-update