在一般的 update in
寫法就是:
update table_name set column = 'xxx' where column2 in (select x from table_name2 where xxxxxx)
但是這種寫法在表數據量小的時候不會有啥問題, 但是在表的數據量比較大的情況下, 這樣就會引起全表掃描, 子查詢帶來了巨大的資源開銷,以及鎖表.
優化後的寫法如下:
update table_a a join table_b b on a.xx=b.xx
set a.xx=要變更的值
where b.xx=條件值
實際例子
第一種寫法:
EXPLAIN
UPDATE t_form_template_function SET del_flag = '1' WHERE struct_id IN ( SELECT DISTINCT id FROM t_form_template_struct WHERE pid = 'GE148389280359880457831') and del_flag='0' ;
分析結果爲: rows : 6661
第二種寫法:
EXPLAIN
UPDATE t_form_template_function f JOIN t_form_template_struct s ON f.struct_id = s.id SET f.del_flag = '1'
WHERE s.pid = 'GE148389280359880457831' AND f.del_flag = '0';
分析結果爲: rows: 6