2014-02-25 230 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上有索引。