基于 MySQL 中最低 ID 的去除重复电子邮件地址

4
我有一个名为emaildata的表,由4列组成:emailaddress,domainname,data和id。 emailaddress列应只包含唯一条目,但存在许多重复项。domainname和data列不是唯一的,并且可能包含重复项,这是可以接受的。id列设置为自动增量,因此仅包含唯一值。 我的问题是如何摆脱特征重复的所有行的电子邮件地址,保留具有最低id的那个? 应该有大约370,000行,但当前我有906,000行。 我以前有一个SQL语句,用于类似的表格,我尝试将其改为适用于此,但没有成功。
delete T1
from emaildata T1, emaildata T2
where T1.emailaddress = T2.emailaddress
and T1.id > T2.id
以上内容基于以下应用于另一个表格并成功运行的内容。
delete T1
from email_list_subscribers T1, email_list_subscribers T2
where T1.emailaddress = T2.emailaddress
and T1.subscriberid > T2.subscriberid

我尝试在phpmyadmin中对远程服务器上的表运行此操作,点击GO按钮后,加载条出现在中间,然后消失,好像正在处理 - 但实际上没有。

我尝试在我的家庭服务器(XAMPP)上运行相同的表,并使用HeidiSQL再次尝试 - phpmyadmin和Heidi似乎都出现了相同的问题崩溃。

我尝试了在这里看到的其他解决方案,但似乎仍然遇到相同的“超时”/崩溃问题。原始语句在远程服务器上运行时从未出现过问题,尽管这是针对一个大小为第三的数据库。

如有任何信息,敬请赐教。

2个回答

4
您的查询似乎是正确的。您遇到的问题似乎是性能问题,而不是逻辑问题。您需要确保数据库中的emailaddressid字段都被正确索引 - 否则,如果接近一百万行,我预计您的查询将挂起。 (我猜测id可能已经被索引,但emailaddress没有。特别是在表之间进行联接时,如果其中任何一个字段未被索引,您将面临大量全表扫描。) 编辑: 看到您的评论,情况就是这样,您可以按照http://dev.mysql.com/doc/refman/5.0/en/create-index.html上的文档创建索引。所以类似于:
CREATE INDEX email_index ON emaildata(emailaddress) USING BTREE;

ID(这里称为我的ID)在表结构下有以下索引。包括电子邮件地址在内,没有其他索引。我应该如何添加它们? myid BTREE 是 否 myid 899943 A - Richard Downes
我怕那个网站对我来说太复杂了。我尝试了你建议的语句,但是出现了以下错误。 #1146 - 表 'emaildata.lookup' 不存在。 - Richard Downes
@RichardDownes - 请看我的更新答案。(在我的上一个评论中,我在 CREATE INDEX 语句中打了一个错字。) - ziesemer
执行成功了 您的 SQL 查询已经成功执行(查询耗时 16.3626 秒) 现在正在尝试我的语句... - Richard Downes
完成了。花了一些时间,但我的结果是376,256,看起来它工作了。感谢您的帮助 :) 祝您新年快乐。 - Richard Downes

0

从未尝试过查看array_unique(php函数)是否修改键,但以下是您可以执行的操作...

选择id和电子邮件并将它们存储在一个数组中,例如id => email

之后使用array_unique获取一个新数组,其中包含每个重复组的第一个id...这就是函数的工作原理...之后比较这两个数组并从您的表中删除剩余的id...

这样,您就可以从重复组中获取第一个id和唯一值。


请将数据库处理问题留在数据库内部,不要跨层移动问题。试图以这种方式从数据库传输近百万行数据到应用程序层,至少需要不必要的时间和RAM,如果不是首先使应用服务器陷入内存不足的情况。 - ziesemer
嘿,你是对的...但你不能总是让数据库中的原始数据保持不变(因此有时必须将数百万行处理出来以供未来处理)...想象一下谷歌输出数百万行...如果我错了,请告诉我...在理查德的情况下,是的,这不是最好的方法,但只是一个想法... - Tudor
同样,一些人认为数据库例程已经过时了...他们会在应用服务器中处理大部分逻辑...而我再次声明,我的方法并不适合理查德的情况... - Tudor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,