优化 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 BYHAVING 但还没有达到我需要的目的。

此外,在同一时间戳中出现多个评论的可能性微乎其微。并且 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) 上的索引。