前言:今天在叶老网站看到一篇多表delete优化案例,这里做一个学习总结。

原SQL:

  1. DELETE
  2. FROM trade_info
  3. WHERE id IN (
  4. SELECT id
  5. FROM (
  6. SELECT a.id
  7. FROM trade_info a, order_info b, USER c
  8. WHERE
  9. b.buyer = c.id AND c.itv_account=’90000248 AND a.order_id = b.id) temp)

【MySQL】多表delete优化案例 - 图1
可以看到执行计划最终是走的全表扫描,效率很低

优化思路:
本例的优化思路是利用多表join关联消除子查询造成的全表扫描

改写成SELECT:

  1. SELECT id
  2. FROM trade_info
  3. WHERE
  4. id IN (
  5. SELECT id
  6. FROM (
  7. SELECT a.id
  8. FROM trade_info a, order_info b, USER c
  9. WHERE
  10. b.buyer = c.id AND c.itv_account=’90000248 AND a.order_id = b.id) temp)

执行计划如下:
【MySQL】多表delete优化案例 - 图2
可以看到执行计划由全表扫描变为基于主键的等值查询,效率大大提升

改写多表delete

官网例子:

  1. DELETE t1 FROM t1 LEFT JOIN t2 ON t1.id=t2.id WHERE t2.id IS NULL;

按照官网例子改写如下

  1. DELETE trade_info
  2. FROM
  3. trade_info,
  4. (
  5. SELECT
  6. a.id
  7. FROM
  8. trade_info a
  9. JOIN order_info b ON a.order_id = b.id
  10. JOIN USER c ON b.buyer = c.id
  11. WHERE
  12. c.itv_account = '90000248'
  13. ) t2
  14. WHERE trade_info.id = t2.id;

参考文章:http://imysql.com/2016/06/29/mysql-optimization-rewrite-delete-subquery-to-join.shtml