SQL语句中count(1),count(*)和count(field)区别

最近使用count函数比较多,当要统计的数量比较大时,发现count(*)花费的时间比较多,相对来说count(1)花费的时间比较少。

查了一些文档有以下的说法:

  • 如果你的数据表没有主键,那么count(1)比count(*)快  
  • 如果有主键的话,那主键(联合主键)作为count的条件也比count(*)要快  
  • 如果你的表只有一个字段的话那count(*)就是最快的啦  
  • count(*) count(1) 两者比较。主要还是要count(1)所相对应的数据字段。  
  • 如果count(1)是聚索引,id,那肯定是count(1)快。但是差的很小的。因为count(*),自动会优化指定到那一个字段。所以没必要去count(?),用count(*),sql会帮你完成优化的 

  count详解: 

count(*)将返回表格中所有存在的行的总数包括值为null的行,然而count(列名)将返回表格中除去null以外的所有行的总数(有默认值的列也会被计入). distinct 列名,得到的结果将是除去值为null和重复数据后的结果 
 

在MySQL中,查询研究得出这个和MySQL中用什么引擎有关,比如InnoDB和MyISAM在处理这count(*)、count(1)、count(field)都有不同的方式,还有就是和版本都有关系,不同的版本会对查询进行优化处理等等。

  1. count(*)对行的数目进行计算,包含NULL
  2. count(column)对特定的列的值具有的行数进行计算,不包含NULL值。
  3. count()还有一种使用方式,count(1)这个用法和count(*)的结果是一样的。
  4. 任何情况下select count(*) from tablename是最优选择;
  5. 尽量减少select count(*) from tablename where COL = ‘value’这种查询;
  6. 杜绝select count(COL) from tablename where COL2 = ‘value’的出现。
  7. 如果表没有主键,那么count(1)比count(*)快。
  8. 如果有主键,那么count(主键,联合主键)比count(*)快。
  9. 如果表只有一个字段,count(*)最快。
  10. count(1)跟count(主键)一样,只扫描主键。count(*)跟count(非主键)一样,扫描整个表。明显前者更快一些。
  11. 若含有where语句,则会优先where中条件索引。

猜你喜欢

转载自blog.csdn.net/Asa_Prince/article/details/84304056
今日推荐