2013-07-31 42 views
0

我有兩張表,我們將它們稱爲email_bounces和master_email_list。在其他表上嵌套查詢的SQL查詢

master_email_list是~3.5m記錄。

email_bounces是〜100,000條記錄。

我試圖做一個查詢,如果電子郵件地址在email_bounces中找到,我在master_email_list中更新反彈= 1。

這是我的。

update 'master_email_list' set bounce=1 where email in (select email FROM 'email_bounces') 

除此之外,似乎沒有工作,它會查詢,然後掛起無限期(我離開它運行在一夜之間,跑前約4小時後)。

幫助表示讚賞。

+0

你有'master_email_list.email'上的索引嗎? –

+0

在master_email_list和反彈表中有電子郵件索引嗎? 此外,嘗試更新'master_email_list'set bounce = 1,其中EXISTS(選擇1 FROM'email_bounces'B,其中M.email = B.email)...但您確實需要首先使用這些索引。 –

+0

爲了在MySQL中提高性能,請勿在謂詞中使用子查詢。改爲使用JOIN操作。 – spencer7593

回答

0

使用

update master_email_list l 
inner join email_bounces b on b.email = l.email 
set bounce = 1 

您也可以嘗試在更新過程中停用鍵來加快速度:

ALTER TABLE master_email_list DISABLE KEYS; 

而且事後

ALTER TABLE master_email_list ENABLE KEYS; 
0

通過使用表別名你必須設置它。

在此我使用內加入

update master_email_list mel 
    inner join email_bounces eb 
    on mel.email = eb.email 
    set mel.bounce = 1 
0

如果簡單的查詢需要時間,我只能看到兩個可能的原因;

  • 你錯過了一個索引master_email_list.email作爲第一列。

    CREATE INDEX ix_email ON master_email_list(email);

...應該加快速度顯著

  • 您在擁有鎖的表上有一個活動事務。檢查是否有未提交的待處理交易,如果找不到它們,請檢查this answer如何查找它們。