8

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

数字表明,DELETE 操作比 INSERT 占用更多的 CPU 资源——我只是想知道为什么?

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

4

3 回答 3

5

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

  1. 插入行
  2. 在二进制日志缓冲区中标记
  3. 标记提交

删除执行以下操作:

  1. 标记行被删除(与插入相同的命中——页面被重写)
  2. 在二进制日志缓冲区中标记
  3. 标记承诺
  4. 实际上去删除行,(与插入相同的命中——页面被重写)
  5. 清除线程也跟踪二进制日志缓冲区中的删除。

为此,您需要进行两次删除而不是插入的工作。删除需要这两次写入,因为它必须标记为所有版本的删除,但只有在没有看到它的事务时才能删除。因为 InnoDB 只将完整的块写入磁盘,所以块的修改惩罚是恒定的。

于 2011-02-17T20:25:00.237 回答
3

DELETE 还需要将数据写入磁盘,重新计算索引,此外,还需要一组逻辑比较来找到您首先尝试删除的记录。

于 2011-02-17T20:04:24.077 回答
1

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

在几乎所有情况下,删除记录时,服务器必须检查对该记录的任何依赖关系作为外键引用。简而言之,就是对系统表进行查询,查找具有指向该表的外键 ref 的表定义,然后选择这些表中的每一个以查找引用要删除的记录的记录。在那里,您已经将计算时间增加了几个数量级,无论服务器是进行级联删除还是只是返回错误。

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

于 2011-02-17T20:06:24.160 回答