Mysql 两个select语句带有count-非常慢

Mysql 两个select语句带有count-非常慢,mysql,sql,Mysql,Sql,我正在尝试获取会话日志表中的所有条目,其中一个会话有10个以上的条目(即会话id的计数大于10)。我现在有两个select语句: select * from log_metrics where session_id in ( select session_id from log_metrics group by session_id having count(*) > 10 ) log_metrics表非常大,大约是。7700000行。内部选择需要12.88秒,并找到178000

我正在尝试获取会话日志表中的所有条目,其中一个会话有10个以上的条目(即会话id的计数大于10)。我现在有两个select语句:

select * from log_metrics where session_id in 
( select session_id from log_metrics 
  group by session_id having count(*) > 10
)
log_metrics表非常大,大约是。7700000行。内部选择需要12.88秒,并找到178000个会话id。整个查询不会以这样的方式运行,但是当将
limit 10
添加到外部选择的末尾时,它会在18秒内完成,
limit 100
会在3分钟35秒内完成。我尝试将限制添加到内部选择,但出现以下错误:

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

有没有办法重写此查询以加快速度?我只需要从返回的log_度量中获取大约5000行,而不是会话id的总数178000行


谢谢你能给我的帮助。我是mysql新手,请原谅我的错误步骤。

尝试切换到
存在的
检查,而不是
中的

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
)

尝试切换到一个
存在
检查,而不是
子句中的

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
)

我不知道这是否可行(我不知道你有什么版本的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个
session\u id
s,而不是日志中的总行数(可能返回50000行或更多)。

我不知道这是否可行(我不知道你有什么版本的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个
session\u id
s,而不是日志中的总行数(可能返回50000行或更多)

下面是一个SQL小提琴:


这里有一个SQL提示:

索引怎么办?会话id上有索引吗?会话id上有索引吗?索引怎么办?会话id上有索引吗?会话id上有索引吗?在子查询上加入可能比使用相关子查询更快。并指定对
会话id上的索引的需要。
。谢谢感谢jonnygold的快速响应。这比我拥有的要快得多,并且实现了这个技巧。谢谢!@Dems-一个好的优化器应该为您做到这一点(SQL Server做到了)。索引当然会有帮助。的确,但MySQL的Optimizer没有那么复杂。以我的经验,我对MySQL的引擎不太熟悉。
count(*)
语法是否强制它提取整个记录?如果是,旧的
count(1)
技巧可能也会有所帮助。加入子查询可能会更快,而不是使用相关子查询。并在
会话id上指定索引的需要。
。感谢jonnygold的快速响应。这比我所拥有的快得多,并且完成了这个技巧。谢谢!@Dems-一个好的优化器应该会为您这样做(SQL Server会的)。索引当然会有帮助。的确,但MySQL的Optimizer不那么复杂。以我的经验,我对MySQL的引擎不太熟悉。
count(*)
语法是否会强制它提取整个记录?如果是这样,旧的
count(1)
技巧可能也会有帮助。