count(1)、count(*)、count(主键)、count(字段)区别
按照性能排序
count(1)=count(*)>count(主键)>count(字段)
count:统计符合查询的条件记录中,函数指定的参数不为NULL的记录有多少个
比如:select count(age) from user
统计user表中age不为NULL的记录有多少条
count的计算过程
通过count函数来统计有多少条记录的时候,Mysql的server层会维护一个count的变量,来记录具体的记录数
如下case
// id 是主键索引
select count(id) from user
如果表里没有其他二级索引,则innodb会遍历主键索引ID,来统计记录数
如果有其他二级索引,则innodb会遍历二级索引来统计记录数,是因为同样的二级索引记录比主键索引记录占用的空间更小,所以二级索引树比主键索引树更小,在遍历二级索引的IO成本比主键的IO成本要低(任何一个二级索引都会包含主键的字段)
count(*)在执行的时候,mysql会转换成参数*转换成0来处理,所以count(*)和count(1)性能是一样的
count(字段):非索引字段计算count的时候,会扫描全表
性能优化
第一种:非具体值,只需要近似值
使用explain或者show tabel status
第二种:使用额外表来记录总数