count(*)、count(1)和count(列名)的区别

1、定义:

  • count(1):常见计数方式,统计目标表的记录行数。括号里表示一个固定值,可以是任何固定的数字字符,是个常量。
  • count(*):常见计数方式,统计目标表的记录行数,与count(1)执行结果相同,但是执行会根据目标表的不同进行优化。
  • count(列名):常见计数方式,统计目标表某一列的非空记录数。它会统计指定列中不为NULL的行数,忽略NULL值。
  • count(distinct(列名)) :其实是 count(列名) + distinct 的结果集,指定列不为NULL,并且在字段值重复的情况下只统计一次

2、异同点

运行结果一致:count(*)和count(1)都是统计表中所有记录的行数,不论其是否包含null值。换而言之,都可以统计NULL,运行结果是一样的;count(列名)和count(distinct(列名)) 统计为该列的非空记录数,不会统计NULL

语义存在差异:count(*)和count(1)执行机制存在差异,count()函数在传入*,1,2,'abc'等值都会返回相同的结果;区别在于count(*)在传入*时,MySQL优化器会找到最小的那棵索引树进行遍历.

引入了官方文档的原话:

InnoDB handles SELECT COUNT(*) and SELECT COUNT(1) operations in the same way. There is no performance difference

For MyISAM tables, COUNT(*) is optimized to return very quickly if the SELECT retrieves from one table, no other columns are retrieved, and there is no WHERE clause. For example:

mysql> SELECT COUNT(*) FROM student;

This optimization only applies to MyISAM tables, because an exact row count is stored for this storage engine and can be accessed very quickly. COUNT(1) is only subject to the same optimization if the first column is defined as NOT NULL.

3、总结:

对于 count(1) 和 count(*) ,效率相当,建议尽量使用 count(*),因为 MySQL 优化器会选择最小的索引树进行统计,针对此操作进行优化。

参考文献:

深度剖析:MySQL count() 函数,这下彻底明白了! - 知乎

MySQL :: MySQL 8.0 Reference Manual :: 12.19.1 Aggregate Function Descriptions

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值