原来页面有select count(*)查询总条数。几百万条数据量比较大。
现在改为取消掉了查询总条数,直接limit 和 offset 。此为背景。
销售那边反应现在看不到总条数。我就解释了 select count(*)搜索全部数据很浪费性能。然后他问我。你做排序的时候不是也要全表数据排序吗? 意思就是说 count(*)那点性能没关系。
是不是真的这样呢?排序和count(*)性能差距有多少呢?

解决方案 »

  1.   

    竟然用 count(*)楼主强人啊!应该用count(索引字段)
      

  2.   

    没问过有些几张表做join一定有索引吗?请回答楼主问题。
      

  3.   

    COUNT(*)与COUNT(COL)
    网上搜索了下,发现各种说法都有:
    比如认为COUNT(COL)比COUNT(*)快的;
    认为COUNT(*)比COUNT(COL)快的;
    还有朋友很搞笑的说到这个其实是看人品的。在不加WHERE限制条件的情况下,COUNT(*)与COUNT(COL)基本可以认为是等价的;
    但是在有WHERE限制条件的情况下,COUNT(*)会比COUNT(COL)快非常多;http://www.ccvita.com/347.html
    1楼看看这篇文章,别自以为是,我也想我们公司那么多大拿都写count(*)也没人说呢。
      

  4.   

    其实感觉差不多count(*)读的是索引里的条数order by
    limit
    要是通过索引的话会快  不通过索引反而会慢
      

  5.   

    优化总结,对于MyISAM表来说:
    1.任何情况下SELECT COUNT(*) FROM tablename是最优选择;
    2.尽量减少SELECT COUNT(*) FROM tablename WHERE COL = ‘value’ 这种查询;
    3.杜绝SELECT COUNT(COL) FROM tablename WHERE COL2 = ‘value’ 的出现。
    以后瞎说不要误人子弟。
      

  6.   

    count(*)和分页有关系吗?分页用的是LIMIT ,不需要知道COUNT(*).
      

  7.   

    刚才问了下我同事,他说order和count(*) 效率差不多,都要搜索全部数据。 或者有其他更精确的牛人来解释下,期待。
      

  8.   

    记得又一次我在php板块回答一位朋友count(*)与count(id)的问题,我说count(*)快,有一位朋友很牛X的引用我,并且很鄙视的说“你做过测试吗?回答问题一定要负责,当然是count(id)快了",当时感觉真郁闷
      

  9.   

    我记得mysql可以使数据索引回收,这样的话你直接查询表的最后一条的索引值,以这个当你的count(*)当然了这是我想的,一般没这么弄的,不过mysql确实有个索引回收
      

  10.   


    哈哈,没想到刚刚,的确,获取最后一条还得需要order by,这样一来又回去了
      

  11.   

    count(*)在MYISAM引擎里面,MYSQL会自己去维护每个MYISAM的记录总数,当需要查询的时候,如果是COUNT(*),一定要是*,而不是其他字段名称,MYSQL就可以直接去维护的那个地方取,不需要扫描表。所以是最快的。《高性能MYSQL》有一节优化COUNT的,里面有一节“MYISAM迷思”,是这么阐述的。如果是INNODB引擎,就需要去扫描表。表很大的时候就很慢了。
      

  12.   


    我认为在表很大的时候,分页显示不需要用COUNT(*)/20得到总的页数,在页面展示的时候用
    select * from tbname limit 20
    select * from tbname limit 21,40
    select * from tbname limit 41,60
    根据点到的多少页,确定LIMIT的参数。
      

  13.   

    SELECT COUNT(*) 不会比 select count(COL) 慢!因为COUNT(COL)还需要判断COL是否为NULL。同样SELECT COUNT(*)也不会比SELECT * FROM  ORDER BY 慢。楼主需要贴出你的代码,否则无法分析问题说明越详细,回答也会越准确!参见如何提问。(提问的智慧