优化查询mysql以统计每个地区的数据

mqkwyuun  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(272)

我有这个查询来计算每个地区的成功总数。这个查询可以工作,但是输出数据需要2分钟,我有15k行。

  1. SELECT
  2. nsf.id,
  3. nsf.province,
  4. nsf.city,
  5. nsf.district,
  6. nsf.shipping_fee,
  7. IFNULL((SELECT COUNT(orders.id) FROM orders
  8. JOIN users ON orders.customer_id = users.id
  9. JOIN addresses ON addresses.user_id = users.id
  10. JOIN subdistricts ON subdistricts.id = addresses.subdistrict_id
  11. WHERE orders.status_tracking IN ("Completed","Successful Delivery")
  12. AND subdistricts.ninja_fee_id = nsf.id
  13. AND orders.transfer_to = "cod"),0) as success_total
  14. from ninja_shipping_fees nsf
  15. GROUP BY nsf.id
  16. ORDER BY nsf.province;

输出应该是这样的

你能帮我提高性能吗?谢谢

1szpjjfi

1szpjjfi1#

尝试在联接的“派生表”而不是“相关子查询”中执行分组/计算

  1. SELECT
  2. nsf.id
  3. , nsf.province
  4. , nsf.city
  5. , nsf.district
  6. , nsf.shipping_fee
  7. , COALESCE( g.order_count, 0 ) AS success_total
  8. FROM ninja_shipping_fees nsf
  9. LEFT JOIN (
  10. SELECT
  11. subdistricts.ninja_fee_id
  12. , COUNT( orders.id ) AS order_count
  13. FROM orders
  14. JOIN users ON orders.customer_id = users.id
  15. JOIN addresses ON addresses.user_id = users.id
  16. JOIN subdistricts ON subdistricts.id = addresses.subdistrict_id
  17. WHERE orders.status_tracking IN ('Completed', 'Successful Delivery')
  18. AND orders.transfer_to = 'cod'
  19. GROUP BY subdistricts.ninja_fee_id
  20. ) AS g ON g.ninja_fee_id = nsf.id
  21. ORDER BY nsf.province;

“相关子查询”通常是性能不佳的一个原因。
其他注意事项,我更喜欢使用coalesce(),因为它是ansi标准,现在在大多数sql实现中都可用。单引号通常用于表示字符串和文本。

展开查看全部

相关问题