删除时间太长且未完成

Delete takes too long and doesn’t finish

我有 2 个 table,其中 1 个有约 150 万条记录,另一个有约 200.000 条记录,我需要删除大 table 中的重复项。我有一个问题,我认为它是正确的,但由于需要很多时间而无法完成该过程。我的问题是需要多长时间?

我的查询:

DELETE jogar_totoloto2
FROM jogar_totoloto2, tbl_todos b
Where jogar_totoloto2.n1 = b.n1
and jogar_totoloto2.n2 = b.n2
and jogar_totoloto2.n3 = b.n3
and jogar_totoloto2.n4 = b.n4
and jogar_totoloto2.n5 = b.n5;

我有一台不错的笔记本电脑,配备 16gb 内存和 amd ryzen 7 4800H 处理器。

使用这台电脑应该会更快或需要在配置文件中注意,my.ini?

我正在等待超过 30 分钟的过程完成,但它还没有完成...怎么了???

INSERT 比 DELETE 快。您可以将 'needed' 数据保留在一个新的 table 中,删除原来的 table 并将新的 table 重命名为 original 吗? (或截断原始数据并从新的 table 加载数据)

您可能需要某些列的索引(可能是所有列,但如果它是包含 5 个数字的 Lotto 抽取,则进行基数检查没有用 - 所有列都是等效的)。

例如

CREATE INDEX jt_ndx ON jogar_totoloto2(n1);
CREATE INDEX tt_ndx ON tbl_todos(n1);

但可以肯定的是,您应该post查询计划的结果:

EXPLAIN DELETE ... /* the rest of your DELETE query */

也许,创建一个新的 table 并在其中保存 匹配的行可能会更好:

CREATE TABLE uniques LIKE jogar_totoloto2;

INSERT INTO uniques SELECT a.*
    FROM jogar_totoloto2 AS a 
    LEFT JOIN tbl_todos AS b
    USING (n1, n2, n3, n4, n5)
    WHERE b.n1 IS NULL;

那你就可以把jogar_totoloto2table删掉,把uniques重命名为jogar_totoloto2,确认内容无误后就可以了。

对我来说,在查询中看到删除有点奇怪。毕竟你只想从一个 table 中删除行,其中 具有相同值的行 存在于另一个 中。那是 WHEREINEXISTS 对我来说:

DELETE FROM jogar_totoloto2
WHERE (n1, n2, n3, n4, n5) IN (SELECT n1, n2, n3, n4, n5 FROM tbl_todos);

不过,我不知道这是否会对执行速度产生任何影响。 MySQL 可能会提出相同的执行计划。

现在,jogar_totoloto2 中的 200,000 tbl_todos 行中有多少行?全部二十万?如果 table 上没有必须在进程中维护的索引,那将是很多并且查询将是 运行 最快的。它甚至可以在 运行 删除语句后禁用或删除索引并删除触发器并再次启用/安装它们。 table jogar_totoloto2 应该是 运行 逐行依次通过。 tbl_todos 上的索引将有助于在这里查找那里的行:

CREATE INDEX idx1 ON tbl_todos (n1, n2, n3, n4, n5);

另一方面,如果 jogar_totoloto2 中只存在少数 tbl_todos 行,那么您将删除 table 中相当小的一部分,您可以从帮助您快速找到这些行的索引。适当的索引是:

CREATE INDEX idx2 ON jogar_totoloto2 (n1, n2, n3, n4, n5);

索引中列的顺序可能很重要。一般建议将最具选择性的列放在第一位。不过,我不知道这在 MariaDB 中是否重要。最有选择性的意思是,如果table中有上万个不同的n4,但只有两个不同的n1,那么在索引中把n4放在n1之前。因此,最佳索引可能如下所示:

CREATE INDEX idx ON tablename (n4, n5, n3, n1, n2);