我有一个大约有1500万行的数据库。每48小时使用LOAD DATA INFILE
加载表。每个表都有一个id
字段。我需要检测具有相同id
的重复行才能替换它们。
我尝试了以下操作,但是问题是数据库太大,无法在合理的时间内完成此查询。
SELECT id FROM table group by id having count(*) >= 2;
我正在使用索引,数据库存储引擎是MyISAM。
是否可以检测这种大小的数据库中的重复行?我尝试在具有100万行的数据库中运行上述查询,并在0.008秒内完成,因此我认为数据库大小是问题所在。
答案 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
,也会阻止写入同一张表。