优化 MySQL 中的子子查询
Optimizing a sub-sub-query in MySQL
我有一个允许对票发表评论的请求票务系统。我添加了一项功能,该功能可在用户登录后向其任何票证显示最新评论,以作为自上次访问以来是否发生任何变化的线索。我可以用一个 sub-sub-select 来完成这个,它在一个小数据库上运行良好,但我怀疑它不会随着时间的推移很好地扩展。
-- stage 1: all user's request ticket ids
SELECT id FROM requests WHERE username='someuser';
-- stage 2: most recent comment on all user's request ticket ids
SELECT
MAX(commented_at)
FROM
requests_comments
WHERE
request_id IN (
-- stage 1
SELECT id FROM requests WHERE username='someuser'
);
-- final stage: whole comment row of any user's most recent comment
-- on all of selected user's request tickets
SELECT
*
FROM
requests_comments
WHERE
commented_at=(
-- stage 2
SELECT
MAX(commented_at)
FROM
requests_comments
WHERE
request_id IN (
-- stage 1
SELECT id FROM requests WHERE username='someuser'
)
);
我试过 GROUP BY
和 HAVING
但还没有达到我需要的目的。
此外,在同一时间戳中出现多个评论的可能性微乎其微。并且 id 键和外键是自动分配的,因此不能相信较高的 id 比较低的 id 更新。
如何优化我的查询以确保性能随时间推移?
如果您只想要给定用户的最新评论,那么您可以将其表示为:
SELECT rc.*
FROM requests r JOIN
requests_comments rc
ON rc.request_id = r.id
WHERE r.username = 'someuser'
ORDER BY rc.commented_at DEC
LIMIT 1;
为了性能,您需要 requests(username, id)
和 request_comments(request_id)
上的索引。
我有一个允许对票发表评论的请求票务系统。我添加了一项功能,该功能可在用户登录后向其任何票证显示最新评论,以作为自上次访问以来是否发生任何变化的线索。我可以用一个 sub-sub-select 来完成这个,它在一个小数据库上运行良好,但我怀疑它不会随着时间的推移很好地扩展。
-- stage 1: all user's request ticket ids
SELECT id FROM requests WHERE username='someuser';
-- stage 2: most recent comment on all user's request ticket ids
SELECT
MAX(commented_at)
FROM
requests_comments
WHERE
request_id IN (
-- stage 1
SELECT id FROM requests WHERE username='someuser'
);
-- final stage: whole comment row of any user's most recent comment
-- on all of selected user's request tickets
SELECT
*
FROM
requests_comments
WHERE
commented_at=(
-- stage 2
SELECT
MAX(commented_at)
FROM
requests_comments
WHERE
request_id IN (
-- stage 1
SELECT id FROM requests WHERE username='someuser'
)
);
我试过 GROUP BY
和 HAVING
但还没有达到我需要的目的。
此外,在同一时间戳中出现多个评论的可能性微乎其微。并且 id 键和外键是自动分配的,因此不能相信较高的 id 比较低的 id 更新。
如何优化我的查询以确保性能随时间推移?
如果您只想要给定用户的最新评论,那么您可以将其表示为:
SELECT rc.*
FROM requests r JOIN
requests_comments rc
ON rc.request_id = r.id
WHERE r.username = 'someuser'
ORDER BY rc.commented_at DEC
LIMIT 1;
为了性能,您需要 requests(username, id)
和 request_comments(request_id)
上的索引。