我有以下表格:
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
I want to display all duplicates by email. Like this:
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
);
查询需要很长时间才能执行大量记录。然而,内部查询工作得更快,但不是外部查询。请帮助。
答案 0 :(得分:1)
是的,这是MySQL查询优化器的问题。事情是 - IN (subquery)
对于MySQL来说与= ANY ()
subquery是一回事。即使子查询返回的值很少,在正常情况下很容易通过索引进行比较(如果它存在于我们正在进行的列IN
上),MySQL也不会对其进行优化。
不要将它与IN (<static values list>)
混淆 - 当MySQL将IN
视为特定类型的子查询而不是作为比较运算符时,情况完全不同 - 因此将使用索引。
因此,可能的解决方案之一是 - 分离您的子查询,以便它返回一些值列表,然后将该列表替换为IN ()
,因为将IN
视为比较运算符而获得索引扫描。但是,在某些情况下,可以通过使用JOIN
替换子查询来获得解决方案。在所有情况下都不可能,因此上述解决方案适用于常见的非平凡案例。