我正在尝试获取会话日志表中的所有条目,其中会话具有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的新手并且发布任何礼仪错误的步骤。
答案 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行或更多行返回)。