查询执行时间过长

时间:2014-07-31 20:15:50

标签: mysql sql performance mysql-workbench database-administration

我目前在数据库中有两个表。被称为电子邮件和未描述的两个表都有一个名为电子邮件的列。现在我想比较这两个表和电子邮件匹配的地方我想将名为Email_status_id的电子邮件表中的列更新为2 ...我正在使用的查询是

UPDATE  Email E
SET E.Email_status_id = 2
WHERE 
    E.Email
  IN (
    SELECT 
     U.Email
    FROM 
     UNSUSCRIBED U);

我目前正在使用mysql。

电子邮件表格有2704569行电子邮件 和未描述的表有12102行电子邮件

查询执行时间将永远持续......

任何减少查询执行时间的建议......

3 个答案:

答案 0 :(得分:2)

首先要在Unsubscribed(Email)上创建一个索引:

create index idx_unsubscribed_email on unsubscribed(email);

或者,更好的是,将其声明为primary key,特别是如果它是表格中的唯一列。

然后,MySQL有时在实现in方面表现不佳。使用索引编写查询的方法有很多种。 Exists是一种典型的方法:

update email e
     set email_status_id = 2
     where exists (select 1 from unsubscribed u where u.email = e.email);

join版本应该与索引具有相似的性能。

编辑:

email(email)上的索引也可以帮助查询。出于某种原因,我认为这已经是表中的一个关键。

答案 1 :(得分:1)

您正在对In子句中的大量数据进行字符串比较。由于您实际上不需要返回的数据,因此可以在Exists

中执行此操作
Update  Email E
Set     E.Email_status_id = 2
Where Exists
(
    Select  1
    From    Unsubscribed    U
    Where   U.Email = E.Email
)

除此之外,EmailEmail表格中Unsubscribed列的正确indexing也会提升您的效果。

答案 2 :(得分:0)

针对整个表的IN语句通常很慢。这是因为它必须针对表中的每一行运行子查询以获取过滤结果集。请尝试使用连接,如下所示:

Update Unsubscribed U join Email E on E.Email=U.Email
SET E.email_status_id = 2