希望使用SQL中的索引在大型数据集中查找重复项

时间:2014-10-26 15:53:16

标签: sql database indexing

我有一个包含用户和电子邮件的数据库。这是一个非常大的数据集,因此我寻找比简单SELECT语句更快的方法。我只想查找哪些用户列出了多个电子邮件地址。我相信我必须这样开始:

CREATE INDEX IX_MyDatabase_Emails
ON MyDatabase (Email ASC)

但说实话,我对索引很新,而且我的SQL很生疏,所以不太确定在那之后该做什么。

2 个答案:

答案 0 :(得分:3)

如果您想计算电子邮件地址,那么汇总是最快的方式。如果你想开始吐出有重复的电子邮件,那么在许多数据库中,以下内容会更快:

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会增加处理时间。

通过&#34;多个&#34;电子邮件地址,我假设你想要不同的电子邮件地址。这是这两个查询之间的区别:

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;

答案 1 :(得分:1)

SQL有两个方面。对表进行操作的语句(SELECT,UPDATE,DELETE和INSERT)。还有一些语句定义了数据的结构。

索引组织磁盘上的数据以提高select语句的速度。索引是定义数据结构的语句。通过查看您的陈述,您的索引应该是措辞:

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