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个结果。我仍然不确定这个数字是否正确。