Mysql 查询执行时间太长
我目前在一个数据库中有两个表。这两个表都有一个名为Email的列。现在我想比较这两个表,无论电子邮件匹配到哪里,我都想将电子邮件表中名为email\u status\u id的列更新为2…我使用的查询是Mysql 查询执行时间太长,mysql,sql,performance,mysql-workbench,database-administration,Mysql,Sql,Performance,Mysql Workbench,Database Administration,我目前在一个数据库中有两个表。这两个表都有一个名为Email的列。现在我想比较这两个表,无论电子邮件匹配到哪里,我都想将电子邮件表中名为email\u status\u id的列更新为2…我使用的查询是 UPDATE Email E SET E.Email_status_id = 2 WHERE E.Email IN ( SELECT U.Email FROM UNSUSCRIBED U); 我目前正在使用mysql 电子邮件表有2704
UPDATE Email E
SET E.Email_status_id = 2
WHERE
E.Email
IN (
SELECT
U.Email
FROM
UNSUSCRIBED U);
我目前正在使用mysql
电子邮件表有2704569行电子邮件
未订阅的表有12102行电子邮件
查询执行时间将花费很长时间
任何减少查询执行时间的建议…您正在对
in
子句中的中的大量数据进行字符串比较。由于您实际上不需要返回数据,因此可以在Exists
中执行此操作:
Update Email E
Set E.Email_status_id = 2
Where Exists
(
Select 1
From Unsubscribed U
Where U.Email = E.Email
)
除此之外,在Email
和Unsubscribed
表中的Email
列中选择适当的选项也会提高您的性能。您在in
子句中对中的大量数据进行字符串比较。由于您实际上不需要返回数据,因此可以在Exists
中执行此操作:
Update Email E
Set E.Email_status_id = 2
Where Exists
(
Select 1
From Unsubscribed U
Where U.Email = E.Email
)
除此之外,在Email
和Unsubscribed
表中的Email
列中选择适当的选项也会提高您的性能。您在in
子句中对中的大量数据进行字符串比较。由于您实际上不需要返回数据,因此可以在Exists
中执行此操作:
Update Email E
Set E.Email_status_id = 2
Where Exists
(
Select 1
From Unsubscribed U
Where U.Email = E.Email
)
除此之外,在Email
和Unsubscribed
表中的Email
列中选择适当的选项也会提高您的性能。您在in
子句中对中的大量数据进行字符串比较。由于您实际上不需要返回数据,因此可以在Exists
中执行此操作:
Update Email E
Set E.Email_status_id = 2
Where Exists
(
Select 1
From Unsubscribed U
Where U.Email = E.Email
)
除此之外,在Email
和Unsubscribed
表中的Email
列中选择适当的选项也会提高您的性能。针对整个表的in语句通常比较慢。这是因为它必须对表中的每一行运行子查询,以获得过滤后的结果集。尝试改用联接,如下所示:
Update Unsubscribed U join Email E on E.Email=U.Email
SET E.email_status_id = 2
针对整个表的IN语句通常比较慢。这是因为它必须对表中的每一行运行子查询,以获得过滤后的结果集。尝试改用联接,如下所示:
Update Unsubscribed U join Email E on E.Email=U.Email
SET E.email_status_id = 2
针对整个表的IN语句通常比较慢。这是因为它必须对表中的每一行运行子查询,以获得过滤后的结果集。尝试改用联接,如下所示:
Update Unsubscribed U join Email E on E.Email=U.Email
SET E.email_status_id = 2
针对整个表的IN语句通常比较慢。这是因为它必须对表中的每一行运行子查询,以获得过滤后的结果集。尝试改用联接,如下所示:
Update Unsubscribed U join Email E on E.Email=U.Email
SET E.email_status_id = 2
第一件事是在取消订阅(电子邮件)
上创建索引:
或者,更好的方法是将其声明为主键
,尤其是当它是表中唯一的列时
然后,MySQL有时在
中实现时做得很差。有多种方法可以使用索引编写查询<代码>存在
是一种典型的方法:
update email e
set email_status_id = 2
where exists (select 1 from unsubscribed u where u.email = e.email);
join
版本应具有与索引类似的性能
编辑:
电子邮件(email)
上的索引也有助于查询。出于某种原因,我假设这已经是表中的一个键。第一件事是在取消订阅(电子邮件)
上创建索引:
或者,更好的方法是将其声明为主键
,尤其是当它是表中唯一的列时
然后,MySQL有时在
中实现时做得很差。有多种方法可以使用索引编写查询<代码>存在
是一种典型的方法:
update email e
set email_status_id = 2
where exists (select 1 from unsubscribed u where u.email = e.email);
join
版本应具有与索引类似的性能
编辑:
电子邮件(email)
上的索引也有助于查询。出于某种原因,我假设这已经是表中的一个键。第一件事是在取消订阅(电子邮件)
上创建索引:
或者,更好的方法是将其声明为主键
,尤其是当它是表中唯一的列时
然后,MySQL有时在
中实现时做得很差。有多种方法可以使用索引编写查询<代码>存在
是一种典型的方法:
update email e
set email_status_id = 2
where exists (select 1 from unsubscribed u where u.email = e.email);
join
版本应具有与索引类似的性能
编辑:
电子邮件(email)
上的索引也有助于查询。出于某种原因,我假设这已经是表中的一个键。第一件事是在取消订阅(电子邮件)
上创建索引:
或者,更好的方法是将其声明为主键
,尤其是当它是表中唯一的列时
然后,MySQL有时在
中实现时做得很差。有多种方法可以使用索引编写查询<代码>存在
是一种典型的方法:
update email e
set email_status_id = 2
where exists (select 1 from unsubscribed u where u.email = e.email);
join
版本应具有与索引类似的性能
编辑:
电子邮件(email)
上的索引也有助于查询。出于某种原因,我假设这已经是表中的一个键。可能是一个更好的地方,但在任何情况下,都不能在不显示表架构的情况下进行评估。您是否在Email.Email
列上有索引?需要更多信息。索引?另外,我不认为这是一个DBA问题。这只是一个查询/索引调优。如果这两个表的Email
字段上都没有索引,那么这将是一个很好的起点。这可能是一个更好的地方,但在任何情况下,都不能在不显示表架构的情况下进行评估。您是否在Email.Email
列上有索引?需要更多信息。索引?而且,我不认为我