我目前在数据库中有两个表。被称为电子邮件和未描述的两个表都有一个名为电子邮件的列。现在我想比较这两个表和电子邮件匹配的地方我想将名为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行电子邮件
查询执行时间将永远持续......
任何减少查询执行时间的建议......
答案 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
)
除此之外,Email
和Email
表格中Unsubscribed
列的正确indexing也会提升您的效果。
答案 2 :(得分:0)
针对整个表的IN语句通常很慢。这是因为它必须针对表中的每一行运行子查询以获取过滤结果集。请尝试使用连接,如下所示:
Update Unsubscribed U join Email E on E.Email=U.Email
SET E.email_status_id = 2