我目前正在大学学习“性能评估”课程,现在我们正在做一项测试,我们正在测试PHP和MySQL数据库服务器上的CPU使用情况。我们使用httperf来创建自定义流量,使用vmstat来跟踪服务器负载。对于INSERT和DELETE(单独运行),我们正在运行3000个与PHP服务器的连接。
数字表明DELETE操作比INSERT操作的CPU密集程度高得多 - 我只是想知道为什么?
我最初认为INSERT需要更多的CPU使用率,因为需要重新创建索引,需要将数据写入磁盘等等。但显然我错了,我想知道是否有人能告诉我技术原因对此。
答案 0 :(得分:5)
至少在InnoDB上(我希望他们能帮到你),你有更多的操作即使没有外键。插入大致是这样的:
删除执行以下操作:
为此,你有两倍的工作要删除而不是插入。删除需要这两个写入,因为它必须被标记为已删除所有版本,但只有在没有剩余的事务看到它时才能删除。因为InnoDB只将完整块写入磁盘,所以块的修改代价是不变的。
答案 1 :(得分:3)
DELETE还要求将数据写入磁盘,再加上重新计算索引,此外还要进行一组逻辑比较,以便首先找到您要删除的记录。
答案 2 :(得分:1)
删除需要的逻辑比你想象的要多;多少取决于架构的结构。
在几乎所有情况下,删除记录时,服务器必须检查该记录的任何依赖关系作为外键引用。简而言之,这是查询系统表的查询,查找具有外键引用此表的表定义,然后选择每个表以引用要删除的记录的记录。就在那里,无论服务器是否进行级联删除或只是抛出错误,您的计算时间都会增加几个数量级。
还必须重新组织自平衡内部数据结构,并且必须更新索引以删除索引树的任何现在空分支,但这些分支在插入操作中将具有对应物。