这是我原来问题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
是否有设置?
或者更有意义的是创建一个新表并插入除重复项之外的所有行?
答案 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
甚至不会出现在您正在检查的范围内。