【问题标题】:MySQL: Why is DELETE more CPU intensive than INSERT?MySQL:为什么 DELETE 比 INSERT 占用更多 CPU?
【发布时间】:2011-02-17 20:00:22
【问题描述】:

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

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

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

【问题讨论】:

  • 显而易见的问题:是否 总是 使 DELETE 比 INSERT 占用更多资源,还是只是您的特定设置?如果总是这样,谁说的?

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


【解决方案1】:

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

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

删除执行以下操作:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 这个参数很大程度上取决于数据库中的约束,以及插入的数据是否会受到这些约束的影响。
    【解决方案3】:

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

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

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

    【讨论】:

    • 如果没有为该表注册外键(传出),则没有额外的工作。如果有外键(传入),则插入的工作量也一样多。外键参数不够强大恕我直言。
    • 我不同意。如果在其他地方没有引用此表的外键,您仍然需要在删除记录之前通过 sysobjects(或其他)的表扫描来验证这一点。插入时不是这样。如果记录引用了外部表,则插入会更昂贵,但不会太多;您必须在引用的表中找到具有引用 ID 的记录。引用的表要么是静态已知的,要么是通过对 sysobjects (et alii) 进行日志时间搜索来发现的,以提取当前表的定义。查找具有引用 ID 的零或一条记录也是日志时间。
    • 假设您必须使用 实际单独的查询检查每个删除请求的外键(我拒绝相信,因为这是一个显而易见的优化他们可能做到了) - 你仍然必须为每个插入做同样的事情。进一步假设在任一方向上都没有 FK,那么删除在语义上与插入没有区别。插入甚至需要将实际字节写入磁盘,甚至可能是索引拆分,但删除 - 没有。 如果 删除通常较慢(FK 除外),我当然想知道原因。
    • 看我的回答。无论外键如何,事务和版本控制都需要更多的删除工作而不是写入工作。 KeithS 似乎误解了数据库对外键的应用。
    • 我认为我们在传入和传出的含义上存在分歧。我将重申:删除可能是外键的记录需要检查该记录可能是外​​键的所有表。删除该记录将比插入该记录更昂贵,因为插入到表中的新记录还不能是任何其他记录的外键,因此不会执行此检查。现在,如果新记录包含外键引用,那么是的,插入会更昂贵,因为您必须检查引用的有效性(即它们是否存在)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-16
    • 1970-01-01
    相关资源
    最近更新 更多