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(*)最快。

count(1) 跟 count(主键) 一样,只扫描主键。count(*) 跟 count(非主键) 一样,扫描整个表。明显前者更快一些。

你可能感兴趣的:(select count(column) 、 select count(*) 和 select count(1) 的区别)