以下内容基于常用的 innodb 存储引擎
执行效率 count(*)=count(1)>count(id)>count(字段)
count() 是一个聚合函数,函数的参数不仅可以是字段名,也可以是其他任意表达式,该函数作用是统计符合查询条件的记录中,函数指定的参数不为 NULL 的记录有多少个
1、count( * )的 * 并不是指数据表的所有列,这个是误解。
count( * ) 底层执行时会被转化为 count(0),与 count(1) 执行效果一样。
count(1) 1这个参数一直不会等于null,所以相当于统计数据表的行数。
2、count( * )、 count(1)、 count( id ) 在执行的时候,如果表里存在二级索引,优化器就会选择二级索引进行扫描。
所以,如果要执行 count(1)、 count(*)、 count(主键字段) 时,尽量在数据表上建立二级索引,这样优化器会自动采用 key_len 最小的二级索引进行扫描,相比于扫描主键索引效率会高一些。
count( * ),count(1)底层不回去取数据出来判断是否为空,直接判断"1"不为空,累计加一。
count(id),需要去取id出来,再判断,不为空才加一。
再来,就是不要使用 count(字段) 来统计记录个数,因为它的效率是最差的,会采用全表扫描的方式来统计。如果你非要统计表中该字段不为 NULL 的记录个数,建议给这个字段建立一个二级索引。