DELETE
FROM
t_workflow_info
WHERE
TaskNo IN (
SELECT
a.form_no
FROM
t_electric_maint_form_accept_v2 a
LEFT JOIN t_electric_maint_task_v2 a1 ON a.maint_task_id = a1.id
WHERE
a1.form_no IN ('CQ-YJRW-ZX2304250002',
'CQ-YJRW-ZX2304250001')
);
这种方式 删除条件为 in 子查询会很慢。
DEPENDENT SUBQUERY: 子查询中的SELECT, 取决于外面的查询。
换句话说,就是子查询执行方式依赖于外层的查询结果。
什么意思呢?它以为着两步走:第一步:【先执行外部SQL查询】MySQL根据”DELETE FROM t_workflow_info WHERE” 得到一个大结果集t1,其数据量就是全表所有行了,假设是85万行。
第二步:【后执行内部SQL子查询】第一步的大结果集t1中的每一条记录,都将与子查询SQL组成新的查询语句:SELECT
a.form_no
FROM
t_electric_maint_form_accept_v2 a
LEFT JOIN t_electric_maint_task_v2 a1 ON a.maint_task_id = a1.id
WHERE
a1.form_no IN ('CQ-YJRW-ZX2304250002',
'CQ-YJRW-ZX2304250001') and a.form_no = %TaskNo%。等于说,子查询要执行85万次……即使这两部查询都用到了索引,也是巨慢的。
优化方式:
DELETE info
FROM
t_workflow_info AS info
LEFT JOIN t_electric_maint_form_accept_v2 a ON info.TaskNo = a.form_no
LEFT JOIN t_electric_maint_task_v2 a1 ON a.maint_task_id = a1.id
WHERE
a1.form_no IN ( 'CQ-YJRW-ZX2304250002', 'CQ-YJRW-ZX2304250001' );