为什么 DELETE 语句不会一次性删除所有满足条件的记录?

时间:2021-02-16 13:01:24

标签: mysql timeout mysql-5.7

我有这个 SQL 语句,它试图删除其字段之一设置为 NULL 的所有 重复 行。 “重复”表示仅在 4 个字段(col1、col4、col5、col6)中具有相同的值。

  DELETE
  FROM owndb.tbl1
  WHERE tbl1.id IN
    (
      SELECT *
      FROM
        (
          SELECT x2.id
          FROM
            owndb.tbl1 x2
            INNER JOIN tbl2 y2 ON x2.col5 = y2.id
            INNER JOIN tbl3 z2 ON x2.col1 = z2.id
            INNER JOIN
              (
                SELECT x1.id, x1.col1, x1.col2, z1.col3, x1.col4, x1.col5, y1.col6, 
                       COUNT(x1.col1), COUNT(x1.col4), COUNT(x1.col5), COUNT(y1.col6)
                FROM owndb.tbl1 x1
                  INNER JOIN tbl2 y1 ON x1.col5 = y1.id
                  INNER JOIN tbl3 z1 ON x1.col1 = z1.id
                GROUP BY x1.col1, x1.col5, x1.col4, y1.col6
                HAVING
                  COUNT(x1.col1)     > 1
                  AND COUNT(x1.col5) > 1
                  AND COUNT(x1.col4) > 1
                  AND COUNT(y1.col6) > 1
              ) AS dups
              ON
                x2.col1     = dups.col1
                AND x2.col5 = dups.col5
                AND x2.col4 = dups.col4
                AND y2.col6 = dups.col6
        ) AS ids
    )
    AND tbl1.col2 IS NULL
  • 在 tbl1 中包含大约 4000 万行的数据库上运行时, 上面的语句确实删除了大部分重复项(大约 0.5 百万),但不断留下一些未删除的内容。需要大约 10 分钟执行。
  • 再次运行时,它再次删除大部分 剩余的重复项(大约 8 万个)但不断留下一些 未删除。再次执行大约 10 分钟。
  • 再次运行时,它会再次删除大部分剩余的重复项,但保留 留下一些未删除。再次执行,大约需要 10 分钟。
  • 依此类推......经过大约 20 次这样的运行后,所有 重复项终于 已删除。

为什么?为什么这个 DELETE 语句不会一次删除所有满足条件的记录?

怀疑某种形式的超时条件,我检查了 MAX_EXECUTION_TIME 的值。它是 0。文档说“SELECT 语句的执行超时,以毫秒为单位。如果值为 0,则不启用超时。”

此外,查看日志,我看到正在检查大约 5x 行:

# Query_time: 860.938912  Lock_time: 0.001816 Rows_sent: 0  Rows_examined: 195,651,505
# Query_time: 888.031845  Lock_time: 0.000881 Rows_sent: 0  Rows_examined: 195,679,037
# Query_time: 918.936984  Lock_time: 0.001823 Rows_sent: 0  Rows_examined: 195,647,462
# Query_time: 864.034052  Lock_time: 0.002571 Rows_sent: 0  Rows_examined: 195,641,058
# Query_time: 907.320618  Lock_time: 0.001008 Rows_sent: 0  Rows_examined: 195,645,355

我需要做什么才能单次运行删除所有这样的记录,只要它需要花费的时间?

0 个答案:

没有答案