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

文章详细比较了SQL查询中count(*)、count(列名)、count(主键)和count(1)等四种计数方法的区别,强调count(*)和count(1)在处理NULL值时相同且性能最优。在InnoDB引擎中,MySQL会选择最小的索引进行遍历以优化count(*)操作,而在MyISAM中,总行数直接存储,效率较高。
摘要由CSDN通过智能技术生成

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

count(*)会统计值为NULL的行,

而count(列名)不会统计此列为NULL值的行。

id

name

1

张三

2

李四

3

NULL

这里count(*)就是 3, count(name)就是 2。

最好不要使用count(列名)或count(常量)来替代count(*),除非统计的都是非空的记录总数。

四种 count 的区别:


既然都说到这里了,干脆就把 4 种 count 的区别都对比下:

count (字段):遍历整张表,需要取值,判断 字段!= null,按行累加;
count (主键) :遍历整张表,需要取 ID,判断 id !=null,按行累加;
count (1) :遍历整张表,不取值,返回的每一行放一个数字 1,按行累加;
count (*):不会把全部字段取出,专门做了优化,不取值。count ( * ) 肯定不是 null(没有就是0),按行累加。
count(*)和count(1) 和count(0)一样,都包括对NULL的统计

count (主键) 可能会选择最小的索引来遍历,而 count (字段) 的话,如果字段上没有索引,就只能选主键索引,所以性能上 count (字段) < count (主键)

因为 count (*) 和 count (1) 不取字段值,减少往 server 层的数据返回,所以比其他 count (字段) 要返回值的性能较好;

1.由于count(*)的算法与列偏移量无关,所以count(*)最快。

2.因为count(指定的有效值),执行计划都会转化为count(*)

3.列的偏移量决定性能,列越靠后,访问的开销越大

如果指定的是列名,会判断是否有null,null不计算

所以结论是:

count(*) = count(1) = count(0) > count(主键 id) > count(字段)

MySQL 对 count (*) 做了什么优化?


InnoDB 是索引组织表,主键索引树的叶子节点是数据,而普通索引树的叶子节点是主键值。因此,普通索引树比主键索引树小很多

对于 count (*) 来说,遍历哪个索引树得到的结果逻辑上都是一样的。MySQL 优化器会找到最小的那棵树来遍历。在保证逻辑正确的前提下,尽量减少扫描的数据量,是数据库系统设计的通用法则之一

count (*) 在不同引擎中的实现方式是不一样的:

  • MyISAM:不支持事务,把一个表的总行数存在了磁盘上,因此执行 count (*) 的时候会直接返回这个数,效率很高;当然这里讨论的是没有 where 条件下的 count,如果有 where 条件,那么即使是 MyISAM 也必须累积计数的。

  • InnoDB:支持事务,它执行 count (*) 的时候,需要把数据一行一行地从引擎里面读出来,然后累积计数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值