MySQL:为什么DELETE比INSERT更加CPU密集?

时间:2011-02-17 20:00:23

标签: mysql cpu-usage sql-insert sql-delete

我目前正在大学学习“性能评估”课程,现在我们正在做一项测试,我们正在测试PHP和MySQL数据库服务器上的CPU使用情况。我们使用httperf来创建自定义流量,使用vmstat来跟踪服务器负载。对于INSERT和DELETE(单独运行),我们正在运行3000个与PHP服务器的连接。

数字表明DELETE操作比INSERT操作的CPU密集程度高得多 - 我只是想知道为什么?

我最初认为INSERT需要更多的CPU使用率,因为需要重新创建索引,需要将数据写入磁盘等等。但显然我错了,我想知道是否有人能告诉我技术原因对此。

3 个答案:

答案 0 :(得分:5)

至少在InnoDB上(我希望他们能帮到你),你有更多的操作即使没有外键。插入大致是这样的:

  1. 插入行
  2. 在二进制日志缓冲区中标记
  3. 标记提交
  4. 删除执行以下操作:

    1. 删除标记行(与插入相同的匹配 - 重写页面)
    2. 在二进制日志缓冲区中标记
    3. 马克承诺
    4. 实际上去除行,(与插入相同的点击 - 页面被重写)
    5. 清除线程也会跟踪二进制日志缓冲区中的删除。
    6. 为此,你有两倍的工作要删除而不是插入。删除需要这两个写入,因为它必须被标记为已删除所有版本,但只有在没有剩余的事务看到它时才能删除。因为InnoDB只将完整块写入磁盘,所以块的修改代价是不变的。

答案 1 :(得分:3)

DELETE还要求将数据写入磁盘,再加上重新计算索引,此外还要进行一组逻辑比较,以便首先找到您要删除的记录。

答案 2 :(得分:1)

删除需要的逻辑比你想象的要多;多少取决于架构的结构。

在几乎所有情况下,删除记录时,服务器必须检查该记录的任何依赖关系作为外键引用。简而言之,这是查询系统表的查询,查找具有外键引用此表的表定义,然后选择每个表以引用要删除的记录的记录。就在那里,无论服务器是否进行级联删除或只是抛出错误,您的计算时间都会增加几个数量级。

还必须重新组织自平衡内部数据结构,并且必须更新索引以删除索引树的任何现在空分支,但这些分支在插入操作中将具有对应物。