【问题标题】:Optimizing a sub-sub-query in MySQL优化 MySQL 中的子子查询
【发布时间】: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 BYHAVING,但没有到达我需要的位置。

此外,在同一个时间戳中具有多个 cmet 的可能性是无限小的。并且 id 键和外键是自动分配的,因此不能相信较高的 id 比较低的 id 更新。

如何优化我的查询以确保随着时间的推移性能?

【问题讨论】:

    标签: mysql optimization subquery


    【解决方案1】:

    如果您只想要给定用户的最新评论,那么您可以将其表示为:

    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) 上建立索引。

    【讨论】:

      猜你喜欢
      • 2011-11-27
      • 2021-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多