mysql 从select语句执行简单更新时,系统会在运行时卡住

xuo3flqw  于 2023-04-28  发布在  Mysql
关注(0)|答案(1)|浏览(136)

我正在运行下面的查询,在这里我只是得到了一堆ID,我想在更新语句中使用这些ID,然后用它们来更新

SET sql_safe_updates=0;
create temporary table nullmeters
    select me.id from met me
    join  tab1 ac on ac.accounts_id = me.id
    join tab2 po on ac.val1 = po.id
    join tab3 te on te.id = me.team_id
    where
    me.name = 'NULL';

select * from nullmeters;

update tab1 set deleted = 1 where id in (
select id from nullmeters
);

update met set deleted = 1 where id in (
select id from nullmeters
);

drop temporary table nullmeters;

当我运行这个时,它看起来会陷入运行状态,而不是在update语句中继续前进。当尝试使用从临时表中选择的id进行更新时,它看起来会卡住。select是好的,temp表保存了查询中的所有id
如果我运行update语句,但实际值为i。e
update tab1 set deleted = 1 where accounts in('1','2');
update met set deleted = 1 where id in('1','2');
它工作正常。

9cbw7uwe

9cbw7uwe1#

MySQL通常对WHERE ... IN (SELECT ...)的优化很差。使用join会更好:

UPDATE tab1 AS t
JOIN nullmeters AS n ON t.id = n.id
SET t1.deleted = 1;

另外,您应该在nullmetersid列上添加索引。

ALTER TABLE nullmeters ADD INDEX (id);

相关问题