【问题标题】:In MySQL, is it faster to delete and then insert or is it faster to update existing rows?在 MySQL 中,删除然后插入更快还是更新现有行更快?
【发布时间】:2011-04-30 12:47:12
【问题描述】:

首先,我只想说我正在使用 PHP 框架 Yii,所以如果可能的话,我想留在它定义的 SQL 语句集中。我知道我可能会创建一个很长的 SQL 语句来完成所有工作,但我宁愿不去那里。

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

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

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

选项 1:

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

选项 2:

  • 浏览当前的每一行以查看发生了什么变化,并进行相应的更新
  • 如果需要插入更多行,请执行此操作。
  • 如果需要删除行,请执行此操作。

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

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

有什么想法吗?大家会怎么做?

【问题讨论】:

    标签: php mysql performance yii


    【解决方案1】:

    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

    【讨论】:

    • 谢谢,有道理。不幸的是,当您使用基于 ActiveRecord 的框架时,创建自定义 SQL 语句并包含“INSERT ... ON DUPLICATE KEY UPDATE”并不总是那么容易。如果我这样做,我将不得不手动创建一个查询,如果我将来需要切换 DBMS,该查询很可能不会翻译。
    • 检查您的框架是否提供任何类型的功能来帮助您实现这一目标。否则,只需执行update
    • 用 10 条 SQL 语句单独更新 10 行真的会比用两条 SQL 语句删除 10 行然后添加 10 行更快吗?
    • 尝试在 1 个 SQL 语句中完成所有更新。这有帮助。
    • 我无法在 1 条 SQL 语句中全部完成,因为我将它们更新为的值在所有更新的行中都不一致。鉴于此,将 10 行 1 逐 1 更新比进行批量删除然后插入更好吗?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-18
      • 2021-09-21
      • 1970-01-01
      • 1970-01-01
      • 2021-01-05
      • 2014-08-27
      • 1970-01-01
      相关资源
      最近更新 更多