mysql - 将带有 SUM 和许多 WHERE 的子查询转换为 Join 结构以提高性能
问题描述
我能以更有效的方式获得相同的结果吗?
下面的查询对于少数记录来说很快,但是我有一个巨大的性能问题,有超过 100 个结果并且tasks
表已经很大。
我想把它重做一个 JOIN 结构,但到目前为止还没有运气。
任何帮助,将不胜感激。
SELECT
`t`.*,
(
SELECT SUM(`tasks_sub`.`delivered`)
FROM `tasks` AS `tasks_sub`
WHERE ((`tasks_sub`.`table` = `t`.`table` AND `tasks_sub`.`proces_id` = `t`.`proces_id`)
OR (`tasks_sub`.`order_id` = `t`.`order_id`))
AND `tasks_sub`.`index` = `t`.`index`
) AS `sum_delivered`
FROM
`tasks` AS `t`
表tasks
结构:
Tasks
`id`, `table`, `proces_id`, `index`, `delivered`
解决方案
考虑这个重写
SELECT t.*,
( SELECT SUM(ts.`delivered`)
FROM `tasks` AS ts
WHERE ts.`table` = `t`.`table`
AND ts.`proces_id` = `t`.`proces_id`
AND ts.`index` = `t`.`index`
) +
( SELECT SUM(ts.`delivered`)
FROM `tasks` AS ts
WHERE ts.`order_id` = `t`.`order_id`
AND ts.`index` = `t`.`index`
) AS delivered
FROM tasks AS t
连同两个新索引:
tasks: INDEX(table, proces_id, index, delivered)
tasks: INDEX(order_id, index, delivered)
推荐阅读
- google-cloud-platform - 通过 Terraform 分配用户项目访问权限
- spring-boot - RabbitMQ 主题交换,向特定消费者发送消息
- html - 如何创建响应式客户徽标库
- laravel - Laravel-Vue 组件
- spring-boot - 如何在 Spring 中将可分页对象与自定义查询一起使用
- c# - 从 C# 运行 orientdb 服务器
- plugins - 使用 Telegraf 和 InfluxDB 的 Modbus TCP 连接被拒绝
- sql - SQL:如何将具有值的多个日期行(年、一月、二月、三月、...、十二月)转换为日期和值列?
- azure - Elastic Search - 文档文本搜索
- angular - Internet Explorer 11 中的 Angular 9 应用程序白屏和空控制台