这种缓慢的MySQL查询需要改进

时间:2014-02-10 22:26:34

标签: mysql sql

此查询有效,并为我提供了所需的信息,但速度非常慢:只需要18秒即可累计只有4,000条记录的数据库。 我将它带到这里,看看是否有人对如何改进它有任何建议。

SELECT COUNT( status ) AS quantity, status 
FROM log_table
WHERE time_stamp
IN (SELECT MAX( time_stamp ) FROM log_table GROUP BY userid )
GROUP BY status

这是它在纯文本中做什么/需要做什么:

我有一个充满日志的表,每个日志包含一个“userid”,“status”(1-12之间的整数)和“time_stamp”(创建日志时的时间戳)。特定用户标识可能有许多条目,但具有不同的时间戳和状态。我正在尝试获取每个用户标识的最新状态(基于time_stamp),然后计算所有用户中每个最新状态的出现次数。

我最初的想法是使用带有GROUP BY用户ID的子查询,它运行得很快 - 但是它总是为每个用户ID返回第一个条目,而不是最新的 。如果我可以使用time_stamp DESC来执行GROUP BY userid来识别哪一行应该是该组的代表,那就太好了。但当然组内的ORDER BY不起作用。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

首先要尝试的是明确join

SELECT COUNT(status) AS quantity, status 
FROM log_table join
     (select lg.userid, MAX( time_stamp ) as maxts
      from log_table lg
      GROUP BY userid
     ) lgu
     on lgu.userid = lg.userid and lgu.maxts = lg.time_stamp
GROUP BY status;

另一种方法是使用不同的where子句。如果您在log_table(userid, time_stamp)上有索引,这将最有效。这种方法通过说“对于给定用户没有比这个更大的时间戳”来进行过滤:

SELECT COUNT(status) AS quantity, status 
FROM log_table
WHERE not exists (select 1
                  from log_table lg2
                  where lgu.userid = lg.userid  and lg2.time_stamp > lg.time_stamp
                 )
GROUP BY status;