从大dB中删除重复的行

时间:2013-07-10 19:56:48

标签: mysql sql amazon-web-services

这是我原来问题posted here的第二篇文章。

我的设置:
amazon RDS使用MySQL Workbench并将连接超时设置为最大

我正在尝试从我的dB中删除重复行,这些行已接近1MIL行。

表格如下所示,mytext是mediumtext blob。 id是AUTO_INCREMENT

+---+-----+-----+------+-------+
|id |fname|lname|mytext|morevar|
|---|-----|-----|------|-------|
| 1 | joe | min | abc  | 123   |
| 2 | joe | min | abc  | 123   |
| 3 | mar | kam | def  | 789   |
| 4 | kel | smi | ghi  | 456   |
+------------------------------+ 

我想最终得到一张像这样的表

+---+-----+-----+------+-------+
|id |fname|lname|mytext|morevar|
|---|-----|-----|------|-------|
| 1 | joe | min | abc  | 123   |
| 3 | mar | kam | def  | 789   |
| 4 | kel | smi | ghi  | 456   |
+------------------------------+  

此解决方案开始工作,但在大约10,000行之后,该过程需要更长时间并且最终会挂起。

我让它运行超过20个小时,设置为万行条件(我认为删除块会更安全)。(
) 但即使使用WHERE子句,系统也会挂起,我必须重新启动RDS才能访问dB。

DELETE
FROM yourTable
  WHERE id>40000 
   AND id<=50000
AND id NOT IN
(
        SELECT MAXID FROM
        (
                SELECT MAX(id) as MAXID
                FROM yourTable
                GROUP BY mytext
        ) as temp_table
)

继承创建声明

CREATE TABLE `yourTable` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `fname` varchar(45) DEFAULT NULL,
    `lname` varchar(45) DEFAULT NULL,
    `mytext` mediumtext,
    `morevar` bigint(20) DEFAULT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1$$

问题
这个sql命令是否可以用于处理大量行以及我想要实现的目标?或者是否有更好的解决方案。

处理1MIL行通常需要多长时间?

对于大数据集操作,亚马逊内部的php.ini是否有设置?

或者更有意义的是创建一个新表并插入除重复项之外的所有行?

1 个答案:

答案 0 :(得分:0)

我真的不会使用NOT IN

我会确保myText, id上有一个索引,然后尝试这个......

DELETE
FROM
  yourTable
WHERE
      id >  40000
  AND id <= 50000
  AND EXISTS (SELECT *
                FROM yourTable AS lookup
               WHERE lookup.myText = yourTable.myText
                 AND lookup.id    >  yourTable.id
             )

这样您只需检查可能会删除的myText值。

您的子查询将返回id的{​​{1}} s,其中myText甚至不会出现在您正在检查的范围内。