Php 在MySQL中,是删除然后插入更快,还是更新现有行更快?

Php 在MySQL中,是删除然后插入更快,还是更新现有行更快?,php,mysql,performance,yii,Php,Mysql,Performance,Yii,首先,我要说的是,我使用的是PHP框架Yii,所以如果可能的话,我希望保持在其定义的SQL语句集内。我知道我可能会创建一个巨大的长SQL语句来完成所有事情,但我不想去那里 好的,假设我有一个表格用户和一个表格颜色。然后我有一个表单,用户可以通过选中一个或多个可能的颜色列表中的复选框来选择他们的颜色偏好 这些结果存储为FavColors表中的多行,如下所示(id、user\u id、color\u id) 现在想象用户进入并更改其颜色偏好。在这种情况下,将新的颜色首选项输入数据库的最有效方法是什么

首先,我要说的是,我使用的是PHP框架Yii,所以如果可能的话,我希望保持在其定义的SQL语句集内。我知道我可能会创建一个巨大的长SQL语句来完成所有事情,但我不想去那里

好的,假设我有一个表格用户和一个表格颜色。然后我有一个表单,用户可以通过选中一个或多个可能的颜色列表中的复选框来选择他们的颜色偏好

这些结果存储为FavColors表中的多行,如下所示(id、user\u id、color\u id)

现在想象用户进入并更改其颜色偏好。在这种情况下,将新的颜色首选项输入数据库的最有效方法是什么

选项1:

  • 批量删除用户id匹配的所有行
  • 然后批量插入所有新行
选项2:

  • 浏览当前的每一行,查看更改的内容,并相应地更新
  • 如果需要插入更多行,请执行该操作
  • 如果需要删除行,请执行该操作
我喜欢选项一,因为它只需要两条语句,但删除一行可能会返回几乎完全相同的数据,这会让人感觉不对劲。还有一个问题是让ids自动增加到更快的更高值,我不知道是否应该尽可能避免

选项2将需要更多的编程工作,但可以防止我删除一行只是为了再次创建它的情况。然而,在PHP中增加更多的负载可能不值得降低MySQL的负载


有什么想法吗?你们都会怎么做?

更新
要快得多。当您更新时,表格记录只是用新数据重写。所有这些都必须在插入时再次执行

当您
DELETE
时,应该更新索引(记住,您删除的是整行,而不是需要修改的列),并且数据块可能会被移动(如果您达到
PCTFREE
限制)。同时,删除和添加自动增量上的新更改记录ID,因此,如果这些记录具有可能被破坏的关系,或者也需要更新。我会选择
更新

这就是为什么您更喜欢插入。。。在重复密钥更新时
而不是
替换

前者是密钥冲突情况下的
UPDATE
操作,后者是
DELETE/INSERT

更新:下面是一个示例
插入表(a、b、c)值(1、2、3)
重复密钥更新时c=c+1

有关更多详细信息,请阅读更新,
你试过做准备好的陈述吗?使用准备好的语句,您可以使用不同的参数批处理一个查询并多次调用它。在循环结束时,您可以用最少的网络延迟执行所有这些操作。我用php编写了语句,效果很好。比java编写的语句更令人困惑

谢谢,这很有道理。不幸的是,当您使用基于ActiveRecord的框架时,创建自定义SQL语句并包含“INSERT…on DUPLICATE KEY UPDATE”并不总是那么容易。如果我这样做,我将不得不手动创建一个查询,并且如果我将来需要切换DBMS,该查询很可能不会转换。请检查您的框架是否提供了任何类型的功能来帮助您实现这一点。否则,只需执行
更新
。使用10条SQL语句分别更新10行是否真的比删除10行然后使用两条SQL语句添加10行要快?请尝试在一条SQL语句中完成所有更新。这很有帮助。我不能在一条SQL语句中完成所有操作,因为我要更新它们的值在所有更新的行中都不一致。考虑到这一点,1乘1更新10行是否比批量删除然后插入更好?