我正在为正在编辑现有记录的用户处理包含大量字段的表单。用户可能只更改了一个字段,我通常会执行更新查询来设置所有字段的值,即使它们中的大多数都没有更改。我可以进行某种跟踪,看看哪些字段实际发生了变化,只更新了少数字段。更新记录中的所有字段与仅更改的字段之间是否存在性能差异?还有其他理由可以采用这两种方法吗?霰弹枪方法非常简单......
答案 0 :(得分:7)
我想说这取决于以下几点:
如果要传输大量数据和/或连接是远程的,那么您应该进行一些测试,看看是否可以通过跟踪更改来提高性能。否则,您可能会发现假设正在操作一条记录,它可以忽略不计。
答案 1 :(得分:3)
我会说霰弹枪,但它真的取决于很多东西以及你对数据库的使用。
您必须考虑到UPDATE
不仅要将新的(甚至是未更改的)字段存储到表中,还要考虑:
但是,在所有情况下,您都可以轻松实施并测试任何性能问题是否安全。
答案 2 :(得分:2)
如果您正在谈论合理数量的数据(例如1kb +),那么优化可能是值得的。如果这个语句/表经常运行/更新(每秒几次?),多个用户等,可能值得优化。
您应该已经拥有原始数据的副本,因此找出已更改的内容不是一个大问题,也不会更改update语句以仅适应更改的字段。
所以这可能不是一个坏主意,但除非你想节省带宽,或者觉得你需要提高性能,否则可能没有必要。
答案 3 :(得分:1)
当然,在更新多个字段时会有一些开销,但与维护关于哪些字段更改的状态的成本相比,开销会很小。如果这是一个表,我不会担心根据表单的状态有选择地更新列。
此外,查看像Hibernate这样的数据库框架来抽象其中一些细节可能会很有用。
答案 4 :(得分:1)
通过仅更新单个字段,您实际上可能会失去性能。如果您正在使用预准备语句,那么数据库已经编译了用于更新所有字段的查询计划。如果您开始更新随机字段,那么每次更新时都必须解析查询,从而失去预准备语句的好处。我不确定这对MySQL有多大影响,但我知道它对SQL Server和Oracle来说可能很重要。
答案 5 :(得分:0)
我会选择霰弹枪方法广告,这很容易理解和实施。性能打击应该是可以忽略的。