【问题标题】:Looking to find duplicates in large dataset using indexes in SQL [closed]希望使用 SQL 中的索引在大型数据集中查找重复项 [关闭]
【发布时间】:2014-10-26 15:53:15
【问题描述】:
我有一个包含用户和电子邮件的数据库。这是一个非常大的数据集,所以我正在寻找一种比简单的 SELECT 语句更快的方法。我只是想找出哪些用户列出了多个电子邮件地址。我相信我必须这样开始:
CREATE INDEX IX_MyDatabase_Emails
ON MyDatabase (Email ASC)
但老实说,我是索引新手,而且我的 SQL 生锈了,所以不太确定在那之后该怎么做。
【问题讨论】:
标签:
sql
database
indexing
【解决方案1】:
如果您想计算电子邮件地址,那么聚合是最快的方法。如果您想开始吐出有重复的电子邮件,那么在许多数据库中,以下方法会更快:
select uet.user
from user_email_table uet
where exists (select 1
from user_email_table uet2
where uet2.user = uet.user and uet2.email <> uet2.email
);
为了提高性能,您需要在user_email_table(user, email) 上建立索引。
这将返回重复项。 select distinct 将增加处理时间。
通过“多个”电子邮件地址,我假设您想要 不同 电子邮件地址。这就是这两个查询的区别:
select user, count(*)
from user_email_table
group by user
having count(*) > 1;
和:
select user, count(distinct email)
from user_email_table
group by user
having count(distinct email) > 1;
【解决方案2】:
SQL 有两个方面。对表进行操作的语句(SELECT、UPDATE、DELETE 和 INSERT)。还有定义数据结构的语句。
索引组织磁盘上的数据以提高选择语句的速度。索引是定义数据结构的语句。从你的陈述来看,你的索引应该是这样的:
CREATE INDEX IX_MyDatabase_Emails
On MyDatabase.user_email_table (Email ASC)
如果您的 SELECT 语句执行时间过长,索引将是一个很好的解决方案。您可能希望为用户创建一个索引,因为您正在寻找具有多个电子邮件地址的用户。
计算电子邮件地址的 SELECT 语句是:
SELECT user, COUNT(emails)
FROM user_email_table
GROUP BY user
HAVING COUNT(emails) > 1