更新与插入性能
回答
我不是一个数据库大师,但在这里我的两分钱:
个人而言,我不认为你有很多这方面的事情,即使INSERT会更快(所有被证明),你能转换更新插入?!坦率地说,我认为你不可能一直这样做。
在INSERT过程中,您通常不必使用WHERE来标识要更新哪一行,但根据您在该表上的索引操作可能会产生一些成本。
如果您没有更改包含在任何索引中的任何列,那么您可以快速执行,如果where子句足够简单快捷。
什么都写在石头上,我真的想象它取决于整个数据库设置,指标等。
反正,发现这是作为一个参考:
有时,您可以使用INSERT ... ON DUPLICATE KEYS UPDATE通过INSERT部分模拟UPDATE。但我相信在这种情况下,MySQL执行INSERT,然后更新,如果有重复,那么最终会有两个查询应该比单个UPDATE慢。 –
这要看情况。在WHERE子句中使用主键并仅更新单个非索引字段的简单UPDATE可能比同一个表上的INSERT成本更低。但即使这依赖于数据库引擎。但是,涉及修改多个索引字段的UPDATE可能比该表上的INSERT成本更高,因为需要更多的索引键修改。对于需要对数百万条记录进行表扫描的结构性较差的WHERE子句的UPDATE肯定会比该表上的INSERT更昂贵。
这些陈述可以采用多种形式,但如果您将讨论限制为涉及单个记录的“基本”形式,则大部分成本通常会专门用于修改索引。在UPDATE期间修改的每个索引字段通常涉及两个基本操作(删除旧密钥并添加新密钥),而INSERT需要一个(添加新密钥)。当然,聚集索引会增加一些其他动态,如锁定问题,隔离事务等等。因此,最终,这些语句在一般意义上的比较并不是真的可能,并且如果它实际上可能需要对特定语句进行基准测试重要的。
但是,通常情况下,只使用正确的语句而不用担心它,因为它通常不是在UPDATE和INSERT之间进行选择的选项。
这取决于。如果更新不需要对密钥进行更改,那么很可能它只会像搜索一样花费,然后它的成本可能会低于插入,除非数据库像堆一样组织。
这是我唯一能想到的,因为性能很大程度上取决于所使用的数据库组织。
如果您例如使用MyISAM,我认为它像isam一样组织,插入应该在数据库读取访问方面的成本通常相同,但是它需要一些额外的写入操作。
您无法比较一般的INSERT和UPDATE。给我们一个例子(使用模式定义),我们将解释哪一个花费更多,为什么。另外,你可以通过检查他们的计划和执行时间来主导一个具体的INSERT和UPDATE。
虽然一些拇指规则:
- ,如果你只更新一个字段,这是不编入索引,你只更新一个记录并使用ROWID /主键找到记录,则此更新将花费少于
- INSERT,它也会影响只有一行,虽然这行将有许多非空限制,索引字段;并且必须保留所有这些索引(例如,添加新叶)
在Sybase/SQL Server上,影响具有只读索引的列的更新在内部被替换为删除,然后是插入,所以这显然比插入要慢。我不知道其他引擎的执行情况,但我认为这是一个常用策略,至少在涉及索引时。 现在对于没有索引的表格(或者对于不涉及任何索引的更新请求),我想有些情况下更新可以更快,这取决于表格的结构。
这里的关键资源是磁盘访问(准确的说是IOPS),我们应该评估哪些结果最低。
与其他人一样,不可能给出一个通用的答案,但有一些想法可以让你朝着正确的方向前进,假设一个简单的键值存储和密钥被索引。插入插入新密钥,更新正在更新现有密钥的值。
如果是这种情况(非常常见的情况),更新将比插入更快,因为更新涉及索引查找并更改现有值而不接触索引。您可以假设读取一个磁盘以获取数据并可能写入一个磁盘。另一方面插入将涉及两个磁盘写入一个索引,一个数据。但另一个隐藏成本是btree节点分裂和创建新节点,这将在后台进行,而插入导致平均更多的磁盘访问。
如果您计划执行大型处理(例如对蜂窝公司进行评级或计费),则此问题会对系统性能产生巨大影响。
执行大规模更新与制作许多新表格和索引已证明可将我公司的结算流程从26小时减少到1小时!
我已经为100,000个客户的200万条记录尝试了它。 我第一次创建了帐单表,然后每个客户摘要电话,我更新了帐单表的持续时间,价格,折扣..共有10个字段。
在第二个选项中,我创建了4个阶段。 每个阶段读取前面的表格,创建索引(在表格插入完成后)并使用:“从select中插入..”我创建了下一个阶段的下一个表格。
摘要 虽然第二替代需要更多的磁盘空间(所有视图和临时表在端删除)有3个主要的优点此选项: 1.这是4个时间快于选项1. 2。如果在流程中间出现问题,我可以从失败的位置开始流程,因为阶段一开始的所有表都已准备就绪,流程可以从此点重新开始。如果该过程未能实现第一个选项,则需要重新开始整个过程。 3.这使得开发和QA工作更快,因为他们可以并行工作 。
- 1. 更新与插入
- 2. Linq更新与SQL更新性能
- 3. MySQL性能与更新
- 4. 插入更新
- 5. 使用插入和更新属性
- 6. 更新或插入导航属性
- 7. 插入与specifiv新元素的属性
- 8. MySql性能:插入...在重复密钥更新或更新和ROW_COUNT
- 9. NHibernate与SQLite插入性能问题
- 10. 性能:插入或更新索引选择
- 11. SQL Server性能:删除/插入Vs选择/更新
- 12. 火鸟性能:更新/选择verus插入/选择最后的
- 13. GtkTreeView因排序而导致插入/更新性能损失
- 14. 如何剖析和解决插入/更新性能问题?
- 15. 在Mysql中持续更新/插入存在性能问题
- 16. 插入/查找/更新操作员性能?
- 17. SQLite插入性能
- 18. mysql插入性能
- 19. 蟒蛇插入并更新与psycopg2 tstzranges
- 20. 表格验证插入与更新
- 21. TSQL:更新与插入选择从
- 22. 更新插入的行与触发
- 23. 批量插入与重复键更新
- 24. 批量插入或更新与休眠?
- 25. 以编程方式更新更新插入属性
- 26. SSIS:插入/更新
- 27. 更新插入msaccess
- 28. 更新插入HSQLDB
- 29. 插入+更新/ Upsert?
- 30. 异步插入&更新异步插入&更新:NoSql和SQL
你为什么要比较这些?他们服务的目的完全不同,所以通常你别无选择 - 只要用那个工作。 –
@Lukasz Milewski您可以选择删除表格,如果速度更快,并且实际上得到相同的结果,则可以插入vs更新。有时,删除然后重写所有行比删除所有行更快,如果某一行需要更新,则会更快。 – clg4