在大型MySQL数据库中重复

时间:2018-12-14 15:00:10

标签: mysql sql myisam

我有一个大约有1500万行的数据库。每48小时使用LOAD DATA INFILE加载表。每个表都有一个id字段。我需要检测具有相同id的重复行才能替换它们。 我尝试了以下操作,但是问题是数据库太大,无法在合理的时间内完成此查询。

SELECT id FROM table group by id having count(*) >= 2;

我正在使用索引,数据库存储引擎是MyISAM。

是否可以检测这种大小的数据库中的重复行?我尝试在具有100万行的数据库中运行上述查询,并在0.008秒内完成,因此我认为数据库大小是问题所在。

3 个答案:

答案 0 :(得分:0)

您所做的一切还可以。我建议您编写过程并将选择查询分为多个部分。您可以创建表格并将结果存储在该表格中。

过程完成后,您将得到结果:)

您可以按日期对表进行分区

答案 1 :(得分:0)

我只是对其中一台拥有约8000万行的服务器进行了快速测试,并通过执行以下操作在2分钟内得到了对重复项的响应。

new

这里的主要区别在于,仅对hading子句中的id'd列进行计数,可使mysql更好地利用索引列。

第二,为了删除重复项,您可以从表中选择数据,然后将其导入到另一个具有ID字段作为主键的相同表中,并在MySQL中使用ON DUPLICATE KEY UPDATE语法。

作为一般规则,我也应避免在没有充分理由的情况下使用MyISAM,并希望默认情况下使用InnoDB进行InnoDB的事务控制等。

答案 2 :(得分:0)

考虑LOAD DATA IGNORE(或REPLACE),您可以避免首先加载行。当然,这是假设id上有一些唯一键,也许是PRIMARY KEY(id)

请记住,使用MyISAM,任何操作,即使是简单的SELECT,也会阻止写入同一张表。