zoukankan      html  css  js  c++  java
  • MySQL之count(*)与count(id)效率比较<转>

    MySQL之count(*)与count(id)效率比较  

    2012-10-15 22:29:19|  分类: Mysql |举报 |字号 订阅

     

    MySQL之count(*)与count(id)效率比较<转>

    1.任何情况下SELECT COUNT(*) FROM tablename是最优选择;
    2.尽量减少SELECT COUNT(*) FROM tablename WHERE COL = 'value’ 这种查询;
    3.杜绝SELECT COUNT(COL) FROM tablename的出现。 
     
    COUNT(*)与COUNT(COL)
    网上搜索了下,发现各种说法都有:
    比如认为COUNT(COL)比COUNT(*)快的;
    认为COUNT(*)比COUNT(COL)快的;
    还有朋友很搞笑的说到这个其实是看人品的。
    在不加WHERE限制条件的情况下,COUNT(*)与COUNT(COL)基本可以认为是等价的;
    但是在有WHERE限制条件的情况下,COUNT(*)会比COUNT(COL)快非常多;
    具体的数据参考如下:
    mysql> SELECT COUNT(*) FROM cdb_posts where fid = 604;
    +————+
    | COUNT(fid) |
    +————+
    | 79000 |
    +————+
    1 row in set (0.03 sec)
    mysql> SELECT COUNT(tid) FROM cdb_posts where fid = 604;
    +————+
    | COUNT(tid) |
    +————+
    | 79000 |
    +————+
    1 row in set (0.33 sec)
    mysql> SELECT COUNT(pid) FROM cdb_posts where fid = 604;
    +————+
    | COUNT(pid) |
    +————+
    | 79000 |
    +————+
    1 row in set (0.33 sec)
      
    COUNT(*)通常是对主键进行索引扫描,而COUNT(COL)就不一定了,另外前者是统计表中的所有符合的纪录总数,而后者是计算表中所有符合的COL的纪录数。还有有区别的。
    COUNT时的WHERE
    这点以前就写过,详细请看《Mysql中count(*),DISTINCT的使用方法和效率研究》
    简单说下,就是COUNT的时候,如果没有WHERE限制的话,MySQL直接返回保存有总的行数
    而在有WHERE限制的情况下,总是需要对MySQL进行全表遍历。
     

    在MySQL5下,select count(*) 和select count(id)是完全一样的。
    表里有300万+条记录。
    花了0.8秒,但是我用explain查看查询计划时,却发现它没有用primiary的index,于是强制它使用主键索引,结果花费了7秒!
    我仔细研究了一下默认时使用的索引,居然是用的一个bit(1)上的索引,这个字段就是一个标志位。

    想了一下,估计因为这个索引最小,基于bit(1),而主键是基于int(4)的,并且所有索引都能用于计算count(*),因为总是一条记录对应一个索引元素。

    因此有一个小技巧提供给楼主:如果你的表中有类似标志位(比如是否逻辑删除)的字段,那么在其上建立一个索引,会把count(*)的速度提高数倍。当然最好用bit(1)类型,而不是int或char(1)保存标志位,那样会更慢。
    优化总结:
    1.任何情况下SELECT COUNT(*) FROM tablename是最优选择;
    2.尽量减少SELECT COUNT(*) FROM tablename WHERE COL = 'value’ 这种查询;
    3.杜绝SELECT COUNT(COL) FROM tablename的出现。

  • 相关阅读:
    node.js 安装后怎么打开 node.js 命令框
    thinkPHP5 where多条件查询
    网站title中的图标
    第一次写博客
    Solution to copy paste not working in Remote Desktop
    The operation could not be completed. (Microsoft.Dynamics.BusinessConnectorNet)
    The package failed to load due to error 0xC0011008
    VS2013常用快捷键
    微软Dynamics AX的三层架构
    怎样在TFS(Team Foundation Server)中链接团队项目
  • 原文地址:https://www.cnblogs.com/zhuanli/p/3803741.html
Copyright © 2011-2022 走看看