select|select count(column) 、 select count(*) 和 select count(1) 的区别

有次在统计页面的某个数值时,发现数据总会漏算,后面才知道,select (*)和select (column)是有区别的。
PS:菜是原罪啊!
COUNT() 的作用
据《高性能MySQL》一书记载:

COUNT( ) 有两种非常不同的作用:它可以统计某个列值的数量;也可以统计行数。
在统计列值是如 count(column) 要求列值是非空的,也就是不统计 NULL。
如果在 COUNT()中指定某个列,如 (column),结过则为这个表达式有值的结果数据,不包含 NULL。
总结:
select count(column) 对 特定的列 的值具有的行数进行计算,不包含 NULL 值。
select count(*) 对 行 的数目进行计算,包含 NULL。
当然,select count(1) 和 select count(*) 的结果是一样的。
性能
MyISAM 的 COUNT( ) 函数,只有在没有 Where 的条件下才非常快。因为此时MySQL 可以直接利用存储引擎的特性直接获得这个值。
反过来说,当统计某个列值的数量时,语句带 Where , 那么 MyISAM 的 COUNT( ) 的性能与其他引擎再无区别
1.任何情况下SELECT COUNT(*) FROM tablename是最优选择;
2.尽量减少SELECT COUNT(*) FROM tablename WHERE COL = ‘value’ 这种查询;
3.杜绝SELECT COUNT(COL) FROM tablename WHERE COL2 = ‘value’ 的出现。
  • 如果表没有主键,那么 count(1) 比 count(*) 快。
  • 如果有主键,那么 count(主键,联合主键) 比 count(*) 快。
  • 如果表只有一个字段,count(*)最快。
【select|select count(column) 、 select count(*) 和 select count(1) 的区别】count(1) 跟 count(主键) 一样,只扫描主键。count(*) 跟 count(非主键) 一样,扫描整个表。明显前者更快一些。

    推荐阅读