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 ChannelIDMemberChannels 表两万多条记录,ChannelID 上没有索引.但是同样的表结构、数据和SQL,在SQLServer上瞬间就完成了。MySQL在没有索引的情况下,用where in 子查询语句怎么会这么慢? 这个子查询的结果集只有14条而已。

解决方案 »

  1.   

    这个子查询的结果集只有14条而已。和你的结果条数没关系。100万行里全表扫描出1行,也需要很久。
    ChannelID 上面建个索引。
      

  2.   

    贴出你的EXPLAIN结果explain 
    select ChannelID,count(*) as num from MemberChannels where ChannelID in(
    select distinct ChannelID from GenderChannels where isfixed=0)  
    group by ChannelID;
      

  3.   

    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 瞬间就完成了。 
      

  4.   

    改成 
    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有问题。。
      

  5.   

    用临时表,分成两步执行,也很快。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;
      

  6.   

    你分别打印出EXPLAIN看看MYSQL的执行计划是怎么样的。
      

  7.   

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

    group by ChannelID因为红色这部分对每条记录都会执行一次,虽然有缓存,但显然速度会慢。改成JOIN。另外DISTINCT会更慢。
      

  8.   

    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没有索引的话,咋可能瞬间完成