两个带有计数的select语句 - 非常慢

时间:2012-06-01 16:22:25

标签: mysql sql

我正在尝试获取会话日志表中的所有条目,其中会话具有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表非常大,aprox。 7,700,000行。内部选择需要12.88秒,并找到178,000个会话ID。整个查询没有完成这样写的运行,但是当将limit 10添加到外部选择的末尾时,它在18秒内完成,limit 100在3分35秒完成。我尝试将限制添加到内部选择,但得到以下错误:

  

ERROR 1235(42000):此版本的MySQL尚不支持'LIMIT& IN / ALL / ANY / SOME子查询'

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

感谢您提供的任何帮助。我是mysql的新手并且发布任何礼仪错误的步骤。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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
)

答案 2 :(得分:0)

我不知道这是否会起作用(我不知道你有哪个版本的mySQL,我也没有实例),但是你会想要使用JOIN工作吗? / p>

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 {{1 s,而不是日志中的总行数(可能是50,000行或更多行返回)。