1

这是我在此处发布的原始问题的第二篇文章。

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

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

表看起来像这样,mytext 是一个mediumtextblob。 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 条件下设置为 10000 行(我认为分块删除会更安全)。

但即使使用 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大型数据集操作的设置?

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

4

1 回答 1

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您可能删除的值。

您的子查询将在哪里返回ids for myTexts 甚至没有出现在您正在检查的范围内。

于 2013-07-10T20:10:42.210 回答