三者的计数方式
count(1):
count(1)会统计表中所有的记录数,包括字段为null的记录。
count(*):
count(*)包括了所有列,相当于行数,在统计结果的时候,不会忽略列值为null的,即使某一行的所有列全为null也不会忽略当前行,即最终返回行数。
count(字段):
count(字段)会统计该字段在表中出现的次数,忽略字段为null的情况。即如果该字段为null,那么不进行统计。
三者的执行效果
count(1):
count(1)忽略了所有列,每一列都被使用1来代表,在统计结果的时候,不会忽略列值为null的行,即使某一行所有列都为null,也不会忽略当前行。
count(*):
count(1)包括了所有列,相当于行数,在统计结果的时候,不会忽略列值为null的行,即使某一行所有列都为null,也不会忽略当前行。
count(字段):
count(字段)只包括列名那一列,在统计结果的时候,会忽略列值为空的技术,即如果某一列的当前字段为null,那么不对当前行进行计数。
三者的执行效率
字段为主键时:
count(字段) > count(1)
原因:当某一字段为主键,MySQL自动为当前字段列添加主键索引。主键索引使用B+Tree实现,相比于将每一列都设置为1然后计数效率更高。
字段不为主键:
count(字段) < count(1)
原因:当字段不为主键时,没有主键索引,那么对字段进行count操作,可想而知,首先需要先判断当前字段是否为null,然后再进行计数,而count(1)显然没有这么繁琐。
表有多列且没有主键(基本不会出现):
count(1) ≈ count(*)
MySQL底层对count( * )进行了优化 ,使得其拥有较高的效率。
有主键:
当有主键的时候,select (主键)的执行效率最高。
表有且仅有一个字段:
如果表只有一个字段,那么select (*)的效率最高。
总结:
执行效率上, count(* )> count (1) > count(主键id) >count(字段)
因此尽量使用 count(*)