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

时间:2010-10-26 02:25:22

标签: php mysql performance yii

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

好吧,想象一下我有一个表用户和一个表FavColors。然后我有一个表单,用户可以通过选中大量可能颜色列表中的一个或多个复选框来选择颜色首选项。

这些结果在FavColors表中存储为多行,如下所示(id,user_id,color_id)。

现在假设用户进入并更改了他们的颜色偏好。在这种情况下,将新颜色首选项放入数据库的最有效方法是什么?

选项1:

  • 批量删除user_id匹配的所有行
  • 然后执行所有新行的大量插入

选项2:

  • 浏览每个当前行以查看更改内容并相应更新
  • 如果需要插入更多行,请执行此操作。
  • 如果需要删除行,请执行此操作。

我喜欢选项一,因为它只需要两个语句,但是删除一行只是为了可能放回几乎完全相同的数据而感觉不对。还有一个问题就是让id自动递增到更高的值更多很快,我不知道是否应该尽可能避免这种情况。

选项2将需要更多的编程工作,但是会阻止我只是为了再次创建它而删除行的情况。但是,在PHP中添加更多负载可能不值得减少MySQL的负载。

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

2 个答案:

答案 0 :(得分:9)

UPDATE速度要快得多。当您UPDATE时,表记录只是用新数据重写。所有这些必须在INSERT再次完成。

当您DELETE时,应该更新索引(记住,您删除整行,而不仅仅是您需要修改的列),并且可以移动数据块(如果您点击PCTFREE限制)。同时删除和添加新的更改会在auto_increment上记录ID,因此如果这些记录的关系会被破坏,或者也需要更新。我会去UPDATE

这就是为什么你应该更喜欢INSERT ... ON DUPLICATE KEY UPDATE而不是REPLACE

前者是违反密钥时的UPDATE操作,而后者是DELETE / INSERT

更新:以下是一个示例INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c+1;

有关详细信息,请参阅更新documentation

答案 1 :(得分:1)

菲利普 你有没有尝试过准备好的陈述?使用预处理语句,您可以使用不同参数批处理一个查询并多次调用它。在循环结束时,您可以以最小的网络延迟执行所有这些操作。我已经使用php编写了预处理语句,效果很好。比java编写的语句更令人困惑。