MySql查询需要很长时间

时间:2014-02-25 18:55:36

标签: mysql mysql-slow-query-log

我有以下表格:

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  r@gmail.com
2  2  r@gmail.com
3  3  j@gmail.com

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

cont_id  first_name  email_address

   1        Reeta  r@gmail.com
   2        Rohan  r@gmail.com

这是我的问题:

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
); 

查询需要很长时间才能执行大量记录。然而,内部查询工作得更快,但不是外部查询。请帮助。

2 个答案:

答案 0 :(得分: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来更好地了解你的查询是什么窒息。

答案 1 :(得分: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将以逗号分隔的字符串连接。但是你会知道哪些电子邮件地址是非唯一的。

您还应该在所有表格中contact_id上都有索引(因为您加入了这些字段),也可能email_address也是如此(因为您搜索它)。