以下讨论都是基于InnoDB引擎
count是一个聚合函数,InnoDB只负责根据需求返回结果集,具体的计算过程再Server层完成
count(主键): InnoDB会遍历整张表,把每一行的id取出来,返回给Server层,server判断id是否为空,不为空则累加
count(1): InnDB遍历整张表,但是不取值,Server层对于返回的每一行都会放一个数字1进行,然后判断是否为空,不为空则累加
-
count(字段):
- 如果字段定义为not null, InnoDB会从表中读取出这个字段,Server层判断值不可能为空,直接累加
- 如果字段定义为null, InnoDB从表中读取整个字段是会将值也读取出来,Server层判断值是否为空,不为空则累加
count(
*
): Mysql对count(*) 专门做了优化,InnoDB再扫描的时候不取值,返回给Server层,Serve层直接按行累加
所以按效率排序是: count(*) ≈ count(1) > count(主键) count(字段)