2014-02-25 231 views
2

我有以下表格:MySQL查询需要长时间

Table 1 : Contacts 
Fields : id first_name 

Values : 

1 Reeta 
2 Rohan 
3 John 

Table 2 : email (it contains contact_id of contacts table) 
Fields : id contact_id email_address 

Values : 

1 1 [email protected] 
2 2 [email protected] 
3 3 [email protected] 

我想显示通过电子邮件所有重复。就像这样:

cont_id first_name email_address 

    1  Reeta [email protected] 
    2  Rohan [email protected] 

这里是我的查询:

select contact_id 
from contacts 
where email_address IN (
    SELECT S.email_address 
    FROM contacts R 
    INNER JOIN email 
    ON R.id = S.contact_id 
    Group By email_address 
    Having Count(S.id) > 1 
); 

查询需要很长的时间与大量的记录来执行。然而,内部查询的工作更快,但不是外部查询。请帮忙。

+0

有多少条记录需要多长时间? – Jasper

+0

你创建了哪些索引? id,contact_id,email_address需要索引 – mseifert

回答

0

我会将您的INNER JOIN移到子查询之外。

SELECT 
    c.contact_id, 
    c.first_name, 
    e.email_address 
FROM contacts c 
INNER JOIN email e ON c.id = e.contact_id 
WHERE e.email_address IN (
    SELECT email_address 
    FROM contacts 
    GROUP BY email_address 
    HAVING COUNT(id) > 1 
); 

你也可以实现MySQL的EXPLAIN得到一个更好的主意是怎么窒息查询。

0

另一种方式来做到这一点,这应该是更快的,是这样的:

select email.email_address, group_concat(contacts.contact_id) 
from contacts inner join email on contacts.contact_id=email.contact_id 
group by email.email_address 
having count(contacts.contact_id) > 1; 

现在,你得到你想要的东西;唯一的问题是,联系人ID将被连接为逗号分隔的字符串。但是你会知道哪些电子邮件地址是非唯一的。

在所有表中(因为您加入这些字段)以及可能email_address(因为您搜索它),您还应该在contact_id上有索引。