1

我试图获取会话日志表中的所有条目,其中会话有超过 10 个条目(即 session_id 的计数大于 10)。我现在有两个选择语句:

select * from log_metrics where session_id in 
( select session_id from log_metrics 
  group by session_id having count(*) > 10
)

log_metrics 表相当大,大约。7,700,000 行。内部选择需要 12.88 秒并找到 178,000 个会话 ID。整个查询并没有像这样编写完成,但是当添加limit 10到外部选择的末尾时,它在 18 秒内limit 100完成,在 3 分 35 秒内完成。我尝试将限制添加到内部选择,但出现以下错误:

错误 1235 (42000): 这个版本的 MySQL 还不支持 'LIMIT & IN/ALL/ANY/SOME 子查询'

有没有办法重写这个查询来加快速度?我只需要从返回的 log_metrics 中获取大约 5,000 行,而不是会话 ID 的总数 178,000。

感谢您提供的任何帮助。我是 mysql 的新手,所以请原谅任何礼仪错误。

4

3 回答 3

1
select * 
from log_metrics a
inner join (select session_id from log_metrics group by session_id having count(*) > 10) b
on a.session_id = b.session_id

这是一个 SQL 小提琴:http ://sqlfiddle.com/#!2/7bed6/3

于 2012-06-01T16:44:52.333 回答
0

我不知道这是否可行(我不知道您拥有什么版本的 mySQL,而且无论如何我都没有实例),但是会根据需要使用JOIN作品吗?

SELECT *
FROM log_metrics a
JOIN (SELECT session_id
      FROM log_metrics
      GROUP BY session_id
      HAVING COUNT(session_id) > 10
      LIMIT 5000) b
ON b.session_id = a.session_id

您没有提到这一点,但对于未来的提问者,他需要内部查询中的语句的原因LIMIT因为他想要(最多)5000秒,而不是日志中的总行数(可能返回 50,000 行或更多行) .session_id

于 2012-06-01T16:43:40.227 回答
0

尝试切换到EXISTS检查而不是IN子句:

select * from log_metrics a where EXISTS 
( select b.session_id from log_metrics b
  where a.session_id = b.session_id
  group by b.session_id having count(*) > 10
)
于 2012-06-01T16:27:01.473 回答