MySQL使用PK进行多次更新或使用IN进行一次更新(最大IN大小?)

时间:2010-08-23 22:17:58

标签: mysql oracle performance

IdList = 1,2,3,4,5,6,7,8,9,10

更好:

Foreach(id in IdList)
    Update MyTable set isDeleted = 1 where id = ?id

Update MyTable set isDeleted = 1 where id IN (?IdList)

原谅我的伪代码,但我认为应该清楚。 我知道IN子句中列表的大小有限制。在Oracle中它曾经是255。

我认为多个sqls会慢一些,但是解析IdList会导致DB Server的开销增加。如果列表被排序会更好吗?

2 个答案:

答案 0 :(得分:1)

对数据库的查询越少越好。那说,这个:

Update MyTable set isDeleted = 1 where id IN (?IdList)

...需要动态SQL,因为SQL不支持在IN子句中包含逗号分隔值列表的变量。

如果您在提交之前将查询构造为字符串,请在提交之前将变量连接到该字符串。否则你将不得不使用MySQL's dynamic SQL syntax, called PreparedStatements。请参阅this link for Oracle dynamic SQL示例&资讯

答案 1 :(得分:1)

当选择基于游标的解决方案(第一个)和基于集合的解决方案(第二个)之间时,基于集合会赢得大多数的时间 - 在这种情况下我肯定会选择这两个选项中的第二个 - 它会更有效,更容易阅读/理解。