两条SQL语句,一条查询结果集,一条查询记录数,为什么查询结果集的要比查询记录数的要快,不理解,求高人指及点解决方案查询结果集的语句:
select gq_id,bt,a17,gq.hy_id,lb,lxfs,gq_name,ip,hygq_dj,gq.gx_a17,djcs,cx_dj from
gq  left join hy_gq on gq.hy_id=hy_gq.hy_id where fb_bs='Y' and hf_id=0 limit 0,50统计一共多少条记录数语句,用于分页
select count(*) as count  from  gq  left join hy_gq on gq.hy_id=hy_gq.hy_id  
 where fb_bs='Y' and hf_id=0两条语句的条件都是一样的,我觉得应该是第一条要慢于第二条,但实际情况相反!!求解决方案~~

解决方案 »

  1.   

    第一条语句去掉LIMIT试试,
    应该是第一条慢吧,因为你限制的记录数,故感觉第二条慢
      

  2.   

    如果去掉LIMIT,那一定是第一条慢了,但是不去掉也应该是第一条慢啊,因为第二条就统计个记录数,应该很快的呀
      

  3.   

    不一定哦,第二条先生成临时表,再对临时表统计记录数,速度要受影响,而第一条直接显示临时表,又有记录数限制,比如LIMIT 1
    ,速度更快
      

  4.   

    解决什么?第二条SQL语句速度>第一条?
    不修改SQL语句,不能做到,比如去掉LIMIT OR 加大 LIMIT中的数字
    OR
    select count(gq.hy_id) as count  from  gq  left join hy_gq on gq.hy_id=hy_gq.hy_id 
    where fb_bs='Y' and hf_id=0 GROUP BY gq.hy_idORselect * from  gq  left join hy_gq on gq.hy_id=hy_gq.hy_id 
    where fb_bs='Y' and hf_id=0 GROUP BY gq.hy_idSELECT FOUND_ROWS()
      

  5.   

    select * from  gq  left join hy_gq on gq.hy_id=hy_gq.hy_id
    where fb_bs='Y' and hf_id=0 GROUP BY gq.hy_idSELECT FOUND_ROWS() 
    速度应该更慢
      

  6.   

    索引已建立,我就想让第二条SQL语句快点就行,现在有点接受不了,只要能达到和第一条语句的速度一样就行select count(gq.hy_id) as count  from  gq  left join hy_gq on gq.hy_id=hy_gq.hy_id 
    where fb_bs='Y' and hf_id=0 GROUP BY gq.hy_id SELECT FOUND_ROWS() 这么执行能行吗,先把记录查询出来,然后在统计记录数~~
    感觉不会快!!
      

  7.   

    直接
    select count(gq.hy_id) as count  from  gq  left join hy_gq on gq.hy_id=hy_gq.hy_id
    where fb_bs='Y' and hf_id=0 GROUP BY gq.hy_id 
    就行了,如果记录多的话,速度不会一样,毕竟统计要经过两个步骤,生成临时表、统计,
    查询直接显示临时表就OK了,而且有LIMIT,要快得多
      

  8.   

    毕竟统计要经过两个步骤,生成临时表、对临时表统计, 
    select count(gq.hy_id) as count  from  gq  left join hy_gq on gq.hy_id=hy_gq.hy_id
    where fb_bs='Y' and hf_id=0 GROUP BY gq.hy_id

    COUNT(*)要快一些
      

  9.   

    select count(gq.hy_id) as count  from  gq  left join hy_gq on gq.hy_id=hy_gq.hy_id 
    where fb_bs='Y' and hf_id=0 GROUP BY gq.hy_id 这样执行,是出来多条记录啊,然后我在把这些条记录的结果相加吗,是这个意思吗?
      

  10.   

    QQ:508367253
    MSN:[email protected]
      

  11.   

    不是吧,按gq.hy_id分组,只得出count(gq.hy_id)结果,只有一个字段
      

  12.   

    WWWWA
    WWWWB
    这两个ID是同一个主人的吗?
      

  13.   

    是一个字段,但不是一条记录,是多条记录,因为按HYID分组了
      

  14.   

    不是吧,count(gq.hy_id)就是和嘛,没有用过数据库?测试一下这条SQL语句
      

  15.   

    哦,理解错了,
    这样
    select count(*) from (
    select count(gq.hy_id) as count  from  gq  left join hy_gq on gq.hy_id=hy_gq.hy_id
    where fb_bs='Y' and hf_id=0 GROUP BY gq.hy_id ) aor
    select sum(1) from (
    select count(gq.hy_id) as count  from  gq  left join hy_gq on gq.hy_id=hy_gq.hy_id
    where fb_bs='Y' and hf_id=0 GROUP BY gq.hy_id ) a
      

  16.   

    测试了,是多条记录因为是多个HY_id啊,多条记录是正常的
    count(gq.hy_id)是每个会员的记录之和
    能加我的联系方式吗,这里不太方便
      

  17.   

    呵呵,再加一个SUM OR COUNT就OK了
      

  18.   

    select sum(1) from ( 
    select count(gq.hy_id) as count  from  gq  left join hy_gq on gq.hy_id=hy_gq.hy_id 
    where fb_bs='Y' and hf_id=0 GROUP BY gq.hy_id ) a这样能快吗?难道会比
    select count(*) as count  from  gq  left join hy_gq on gq.hy_id=hy_gq.hy_id 
    where fb_bs='Y' and hf_id=0 它快不理解
      

  19.   

    经过测试
    select sum(1) from ( 
    select count(gq.hy_id) as count  from  gq  left join hy_gq on gq.hy_id=hy_gq.hy_id 
    where fb_bs='Y' and hf_id=0 GROUP BY gq.hy_id ) a这条语句也不快
      

  20.   

    测试一下速度嘛,
    COUNT(主键)速度>COUNT(*)实际上道理已经说过,统计要经过两个阶段,而查询只有一个,且有LIMIT,速度怎么会一样?
      

  21.   

    测试一下速度嘛, 
    COUNT(主键)速度>COUNT(*) 这个也试过,没有明显变化,速度差不多能不能从配置上优化呢,或者其它解决方法难道解决不了了
      

  22.   

    你的SQL语句条件、连接类型不能改变,索引已经建立,在这种情况下,估计比较困难
      

  23.   

    难道还有解决办法
    两个表不是一对一的关系,这条路行不通了表的索引情况
    gq表的索引
    gq_id   主健
    hy_id   会员ID
    hf_id   是否为主帖
    bt      标题
    a17     发布时间
    nr      内容
    gx_a17  更新时间hy_gq表的索引hy_id  主键
    hygq_dj  会员等级
      

  24.   

    这样说吧,你是带条件的count的话,表扫描是不可避免的(虽然可以用索引解决,而且就你这个例子,我看索引和没索引区别不大)。
    执行的时间正比于匹配的记录条数。
    如果条数相当之巨大,那么count的操作比limit慢是当然的。如果你想让count快一点的话,建议使用cache,具体做法:
    1 先用limit 0,20 取出分页第一页的结果
    2 如果结果数少于20,则不用再count了,总数你已经知道
    3 如果结果数==20,
    3.1则去cache中询问一下count值,如果有值,使用cache中的值
    3.2否则去数据库中查询一下count,并写入cache
    4 得到了count值,可以写分页代码了
      

  25.   

    没有道量啊,为什么count(*)会慢呢,MSSQL也不是这样啊,很快的呀,为什么mysql会慢呢
      

  26.   

    还有理解?
    统计要经过两个步骤,生成临时表、统计,
    查询直接显示临时表就OK了,而且有LIMIT,要快得多同样的数据量、SQL语句,MSSQL执行统计速度>显示的速度?不会吧,除非你限制显示条数(top)。
      

  27.   

    表的引擎是MYISAM,看来就是统计速度>显示的速度了,结帖了~~