0

我接手了一个大项目,随着数据库越来越大,部分代码停止工作,

这是查找rendering_requests最后一个rending_log的查询pending,有时有一些日志条目没有状态变化并记录下来,因为noaction我们不需要统计它们。这就是我从查询中了解到的。

SELECT
    COUNT(rr.rendering_id) AS recordCount
FROM
    rendering_request rr, rendering_log rl
WHERE
    rl.rendering_id = rr.rendering_id 
AND rl.status = 'pending'   AND
    rl.log_id = (
            SELECT rl1.log_id
            FROM rendering_log rl1
            WHERE 
            rl.rendering_id = rl1.rendering_id  AND 
            rl1.status = 'pending' 
            AND rl1.log_id = (
                SELECT rl2.log_id
                FROM rendering_log rl2
                WHERE rl1.rendering_id = rl2.rendering_id AND rl2.status!='noaction'
                ORDER BY rl2.log_id DESC LIMIT 1
                    )
            ORDER BY rl1.log_id DESC
            LIMIT 1
            )

例如

rendering_id=1有多个日志

status=noaction
status=noaction
status=pending

rendering_id=2有多个日志

status=noaction
status=assigned
status=noaction
status=pending

当我们运行这个查询时,它应该count=1只显示rendering_id=1我们想要的记录。

现在这个查询已经停止工作,它挂起 mysql 服务器

4

1 回答 1

1

不是 100% 确定我做对了,但是像这样。认为您仍然需要使用几个子选择,但是(取决于 MySQL 的版本)以这种方式使用 JOIN 应该会快得多

SELECT COUNT(rr.rendering_id) AS recordCount
FROM rendering_request rr
INNER JOIN rendering_log rl
ON rl.rendering_id = rr.rendering_id 
INNER JOIN (SELECT rendering_id, MAX(log_id) FROM rendering_log  WHERE status = 'pending' GROUP BY rendering_id) rl1
ON rl1.rendering_id = rl.rendering_id 
AND rl1.log_id = rl.log_id
INNER JOIN (SELECT rendering_id, MAX(log_id) FROM rendering_log  WHERE status!='noaction' GROUP BY rendering_id) rl2
ON rl2.rendering_id = rl1.rendering_id 
AND rl2.log_id = rl1.log_id
WHERE rl.status = 'pending'
于 2012-10-25T15:40:37.417 回答