mysql delete from 条件 in 子查询 很慢优化

心已赠人 2023-10-10 17:57 67阅读 0赞
  1. DELETE
  2. FROM
  3. t_workflow_info
  4. WHERE
  5. TaskNo IN (
  6. SELECT
  7. a.form_no
  8. FROM
  9. t_electric_maint_form_accept_v2 a
  10. LEFT JOIN t_electric_maint_task_v2 a1 ON a.maint_task_id = a1.id
  11. WHERE
  12. a1.form_no IN ('CQ-YJRW-ZX2304250002',
  13. 'CQ-YJRW-ZX2304250001')
  14. );

ccbb6ca10913429ab7c6bd2157e267a6.png这种方式 删除条件为 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万次……即使这两部查询都用到了索引,也是巨慢的。

优化方式:

  1. DELETE info
  2. FROM
  3. t_workflow_info AS info
  4. LEFT JOIN t_electric_maint_form_accept_v2 a ON info.TaskNo = a.form_no
  5. LEFT JOIN t_electric_maint_task_v2 a1 ON a.maint_task_id = a1.id
  6. WHERE
  7. a1.form_no IN ( 'CQ-YJRW-ZX2304250002', 'CQ-YJRW-ZX2304250001' );

发表评论

表情:
评论列表 (有 0 条评论,67人围观)

还没有评论,来说两句吧...

相关阅读