【问题标题】:MySQL JOIN with GROUP BY taking eternally long to runMySQL JOIN with GROUP BY 需要很长时间才能运行
【发布时间】:2016-02-02 17:12:46
【问题描述】:

我的数据库中有两张表,如下:

CREATE TABLE `users` (
  `id` varchar(10) DEFAULT NULL,
  `gender` varchar(9) DEFAULT NULL,
  `age` varchar(5) DEFAULT NULL
  KEY `id` (`id`)
)

CREATE TABLE `sessions` (
  `user_id` varchar(10) DEFAULT NULL,
  `time` int(11) DEFAULT NULL,
  KEY `user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

users 表有大约 200,000 行,sessions 表有大约 10m 行。我正在尝试做一个简单的JOIN,如下:

SELECT users.id, SUM(sessions.time) AS TotalTime,
  FROM users
  LEFT OUTER JOIN sessions
  ON users.id = sessions.user_id
  GROUP BY users.id
  LIMIT 1;

当我运行这个查询时,即使将 LIMIT 设置为 1,它也会无休止地运行而没有结果。如果我省略 GROUP BY 子句,它会立即运行。我可能在这里遗漏了什么,或者仅仅是会话表太大而无法有效工作?

提前感谢您的帮助!

【问题讨论】:

  • 尝试为users.idsessions.user_id添加索引。
  • @Oleander KEY 不是暗示索引吗?
  • 你能发布 EXPLAIN 查询输出吗?
  • 为什么要使用左连接?只是问,你不能减少到内部加入,只为存在的用户选择会话。

标签: mysql sql


【解决方案1】:

您应该首先向表中添加索引和主键。 一个建议是将用户表中的 id 作为主键,在会话表上添加一个 id 列作为主键。您还可以在会话表的 userid 列上添加索引。

【讨论】:

    【解决方案2】:

    在您的表上放置适当的索引以确保性能非常重要。将主键放在 id 上并在 sessions.user_id 上建立索引应该会大大提高您的查询运行时间。

    此外,为了参照完整性,请考虑使用外键和约束。

    如果您的会话数据是临时的(除非您的表充当某种日志并且需要保留数据),请考虑过期/删除不必要的会话条目以最小化表。是否随时需要所有 10M 会话条目?如果有 200k 用户,则活动会话不应超过 200k,因为它们都同时在线。如果以后需要,您还可以考虑定期将非活动条目移动到另一个表以进行长期存储。例如,这可以在用户结束他的会话时立即完成。

    话虽如此,具有 10M 条目的表应该可以正常工作,并且在正确建模的数据库上远不会被视为“太多”。

    【讨论】:

      【解决方案3】:

      KEY 关键字表示两个表中的 user_id 上都有索引,所以看起来没问题。

      LEFT JOIN 通常比INNER JOIN 更耗时。在这种情况下,我建议尝试这样的子查询:

      SELECT users.id,
             (SELECT  SUM(time)
                FROM  sessions
                WHERE users.id = sessions.user_id) AS TotalTime,
        FROM users
        LIMIT 1;
      

      此外,您可以问自己是否真的需要知道用户在 5 年前花费的会话时间。最好将其限制在一个固定时间段内,例如过去 6 个月的总会话时间。

      您需要在sessions 表中添加一列来指定会话发生的时间(日期)。然后你会在上面添加一个过滤器。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-05
        相关资源
        最近更新 更多