【发布时间】:2015-06-02 00:26:05
【问题描述】:
我有一个请求票务系统,允许对票进行评论。我添加了一项功能,该功能可在用户登录时向他们的任何票证显示最新评论,以作为自上次访问以来是否发生任何变化的线索。我可以使用子子选择来完成此操作,该子选择在小型数据库上运行良好,但我怀疑随着时间的推移它不会很好地扩展。
-- 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,但没有到达我需要的位置。
此外,在同一个时间戳中具有多个 cmet 的可能性是无限小的。并且 id 键和外键是自动分配的,因此不能相信较高的 id 比较低的 id 更新。
如何优化我的查询以确保随着时间的推移性能?
【问题讨论】:
标签: mysql optimization subquery