文章目录
整理引用:https://blog.csdn.net/weixin_38192427/article/details/119991560
count()函数
count()
是一个聚合函数,对于返回的结果集,一行行地判断,如果 count
函数的参数不是 NULL
,累计值就加 1
,否则不加。最后返回累计值。
count(*)、count(1) 、count(主键id) 和 count(字段) 区别
count(*)
、count(1)
和 count(主键id)
都表示返回满足条件的结果集的总行数;而count(字段)
则表示返回满足条件的数据行里面,参数“字段”不为 NULL 的总个数
。
count(主键id) 与 count(1)
- 对于
count(主键id)
来说,InnoDB 引擎会遍历整张表,把每一行的 id 值都取出来,返回给 server 层。server 层拿到 id 后,判断 id 不为 NULL 的,就按行累加 - 对于
count(1)
来说,InnoDB 引擎遍历整张表,但不取值。server 层对于返回的每一行,放一个数字 “1” 进去,判断是不可能为空的,按行累加 - 总的来说,
count(1)
执行得要比count(主键id)
快一些。因为从引擎返回 id 会涉及到解析数据行,以及拷贝字段值的操作
count(字段)
count(非空字段)
- 如果这个
“字段”
定义为not null
,一行行地从记录里面读出这个字段,判断不可能为 null,按行累加。 - 注意:
count(非空字段)
与count(主键id)
的效率是一样
的
count(可空字段)
- 如果这个
“字段”
定义为可为null
,那么执行的时候,判断到有可能是 null,还要把值取出来再判断一下,不是 null 才累加
count(*)
count(*)
是例外,优化器专门对其做了优化,并不会把全部字段取出来,而是直接按行累加。
执行效率
按照效率排序,count(可空字段)
< count(非空字段)
= count(主键id)
< count(1)
≈ count(*)
,所以尽量使用 count(*) 就行了