Mysql 将子查询转换为联接以提高性能

Mysql 将子查询转换为联接以提高性能,mysql,join,subquery,Mysql,Join,Subquery,我接手了一个大项目,随着数据库变得越来越大,一些代码停止工作 这里的查询用于查找那些呈现请求谁是最后一个呈现请求日志是挂起的,有时有些日志条目没有状态更改,记录为无操作,我们不需要对它们进行计数。这就是我从这个问题中理解的 SELECT COUNT(rr.rendering_id) AS recordCount FROM rendering_request rr, rendering_log rl WHERE rl.rendering_id = rr.rendering_

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

这里的查询用于查找那些
呈现请求
谁是最后一个
呈现请求
日志是
挂起的
,有时有些日志条目没有状态更改,记录为
无操作
,我们不需要对它们进行计数。这就是我从这个问题中理解的

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
            )
比如说

呈现\u id=1
有多个日志

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

呈现\u id=2
有多个日志

status=noaction
status=noaction
status=pending
status=noaction
status=assigned
status=noaction
status=pending
当我们运行此查询时,它应该显示
count=1
,因为只有
rendering\u id=1
是我们需要的记录


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

不是100%确定我做对了,而是类似这样的事情。我认为您仍然需要使用几个子选择,但是(取决于MySQL的版本)通过连接这样做应该会快得多

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'

嗯,谢谢你的提示,我正在试着运行它。现在它给了我
[Err]1054-on子句中的未知列'rl1.log\u id'
:)好的,我做了,我已经更新了子查询部分
…MAX(log\u id)作为log\u id…
,它在1秒内返回了2236个结果。我仍然不确定这个数字是否正确。