Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL通过长时间运行加入该组_Mysql_Sql - Fatal编程技术网

MySQL通过长时间运行加入该组

MySQL通过长时间运行加入该组,mysql,sql,Mysql,Sql,我的数据库中有两个表,如下所示: 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

我的数据库中有两个表,如下所示:

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;
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;
users表大约有200000行,sessions表大约有10m行。我正在尝试执行一个简单的联接,如下所示:

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;
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;
当我运行这个查询时,即使限制设置为1,它也会无休止地运行,没有结果。如果省略GROUPBY子句,它将立即运行。这里是否有我可能遗漏的东西,或者只是会话表太大,无法有效工作


提前感谢您的帮助

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

为确保性能,在表中添加适当的索引非常重要。将primarey键放在id上,并在sessions.user\u id上建立索引,这将大大提高查询运行时间

还引用引用完整性考虑使用外键和约束。

如果您的会话数据是临时的(除非表充当某种日志,并且需要保存数据),请考虑终止/删除不必要的会话条目以最小化表。是否在任何时候都需要所有10M会话条目?对于200000个用户,活动会话不应该超过200000个,因为他们都同时在线。您还可以考虑将不活动的条目定期移动到另一个表中,以备以后需要的长期存储。例如,当用户结束会话时,可以立即执行此操作


这就是说,一个有1000万个条目的表应该可以正常工作,而且在一个正确建模的数据库中还远远没有被视为“太多”。关键字
表示两个表中都有关于用户id的索引,所以这似乎没问题

左连接
通常比
内部连接
更耗时。在这种情况下,我建议尝试以下子查询:

SELECT users.id,
       (SELECT  SUM(time)
          FROM  sessions
          WHERE users.id = sessions.user_id) AS TotalTime,
  FROM users
  LIMIT 1;
此外,您可以问自己是否真的需要知道用户在5年前的会话时间。最好将其限制在一个固定的时间段内,比如过去6个月的总会话时间


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

尝试向
users.id
会话添加一个索引。user\u id
@Oleander不
KEY
表示索引吗?你能发布解释查询输出吗?为什么使用左连接?只是问一下,你们不能简化为内部连接,只为存在的用户选择会话吗。