首页 > 解决方案 > 将带有 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`

标签: mysqlperformance

解决方案


考虑这个重写

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)

推荐阅读