问题描述
我有这个 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,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
我需要做什么才能单次运行删除所有这样的记录,只要它需要花费的时间?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)