一条非常慢的语句,什么原因?

xieyueqing 2010-11-04 05:26:26
select ChannelID,count(*) as num from MemberChannels where ChannelID in(
select distinct ChannelID from GenderChannels where isfixed=0)
group by ChannelID

这条语句居然执行了2分20秒!!拆开执行都是瞬间完成.
select distinct ChannelID from GenderChannels where isfixed=0 --返回14条

select ChannelID,count(*) as num from MemberChannels
group by ChannelID

MemberChannels 表两万多条记录,ChannelID 上没有索引.

但是同样的表结构、数据和SQL,在SQLServer上瞬间就完成了。

MySQL在没有索引的情况下,用where in 子查询语句怎么会这么慢? 这个子查询的结果集只有14条而已。
...全文
60 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
曾经的阿飞 2010-11-04
  • 打赏
  • 举报
回复
select a.ChannelID,count(*) as num from MemberChannels a
inner join (
select distinct ChannelID from GenderChannels where isfixed=0) b
on a.ChannelID= b.ChannelID
group by ChannelID
你要是MemberChannels表上ChannelID没有索引的话,咋可能瞬间完成
ACMAIN_CHM 2010-11-04
  • 打赏
  • 举报
回复
select ChannelID,count(*) as num from MemberChannels where ChannelID in(
select distinct ChannelID from GenderChannels where isfixed=0)

group by ChannelID

因为红色这部分对每条记录都会执行一次,虽然有缓存,但显然速度会慢。改成JOIN。另外DISTINCT会更慢。
zuoxingyu 2010-11-04
  • 打赏
  • 举报
回复
你分别打印出EXPLAIN看看MYSQL的执行计划是怎么样的。
xieyueqing 2010-11-04
  • 打赏
  • 举报
回复
用临时表,分成两步执行,也很快。

create TEMPORARY table Temp(ChannelID int) engine=heap;
insert Temp select distinct ChannelID from GenderChannels where isfixed=0 ;
select ChannelID,count(*) as num from MemberChannels where ChannelID in(select ChannelID from Temp)
group by ChannelID;
drop TEMPORARY table Temp;

xieyueqing 2010-11-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zuoxingyu 的回复:]
这个子查询的结果集只有14条而已。

和你的结果条数没关系。100万行里全表扫描出1行,也需要很久。
ChannelID 上面建个索引。
[/Quote]
改成
select ChannelID,count(*) as num from MemberChannels where ChannelID in(
80,90,100,10,120,1,2,3,4,5,6,7,8,9)
group by ChannelID
瞬间完成了,感觉是mysql有问题。。

xieyueqing 2010-11-04
  • 打赏
  • 举报
回复
select a.ChannelID,count(*) as num from MemberChannels a
inner join (
select distinct ChannelID from GenderChannels where isfixed=0) b
on a.ChannelID= b.ChannelID
group by ChannelID

改成 inner jion 瞬间就完成了。
ACMAIN_CHM 2010-11-04
  • 打赏
  • 举报
回复
贴出你的EXPLAIN结果

explain
select ChannelID,count(*) as num from MemberChannels where ChannelID in(
select distinct ChannelID from GenderChannels where isfixed=0)
group by ChannelID;



zuoxingyu 2010-11-04
  • 打赏
  • 举报
回复
这个子查询的结果集只有14条而已。

和你的结果条数没关系。100万行里全表扫描出1行,也需要很久。
ChannelID 上面建个索引。
xieyueqing 2010-11-04
  • 打赏
  • 举报
回复
建了索引还是慢,看来不是索引问题。。

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧