2014-02-25 120 views
1

我有以下表格:在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] 

I want to display all duplicates by email. Like this: 

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

查詢需要很長的時間與大量的記錄來執行。然而,內部查詢的工作更快,但不是外部查詢。請幫忙。

+1

可能它不是IN,但是嵌套查詢是問題,請嘗試使用連接查詢 –

+0

您調用的每一行嵌套查詢連接 –

+1

您需要消除子查詢,它將針對外部查詢的每個迭代運行。在這個查詢中加入'EXPLAIN',以獲得有關mysql如何執行的詳細信息。 –

回答

1

是的,這是MySQL查詢優化器的問題。關於MySQL的 - IN (subquery)= ANY() subquery是一樣的東西。即使子查詢返回很少的值,在正常情況下,通過索引(如果它存在於我們正在做的IN的列上)很容易進行比較,MySQL也不會優化。

不要混淆與IN (<static values list>) - 這是完全不同的情況下,當MySQL的對待IN沒有特定類型的子查詢,但作爲比較操作 - 和,因此,使用索引。

因此,可能的解決方案之一是 - 分開你的子查詢,所以它會返回一些值列表,然後將該列表替換爲IN(),因爲將IN作爲比較運算符而獲得索引掃描。但是,在某些情況下,可以通過用JOIN替換子查詢來獲得解決方案。這在所有情況下都是不可能的,因此上述解決方案將適用於常見的非平凡情況。

相關問題