count(*)、count(1)、count(id)、count(字段)的区别和性能分析

亲测:1.建表

CREATE TABLE `user` (
  `id` int(10) DEFAULT NULL,
  `name` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2.存储过程 五十万数据

drop procedure if exists t_add;
create procedure t_add(num int)
begin
declare i int;
set i=1;
while i<num do
INSERT INTO `user` (`name`) VALUES (i);
set i=i+1;
end while;
end;

call t_add(500000);

分析:

查询记录数时会用到count,于是就有个问题。有的人用的是count(*) 有的用的是count(1),区别是什么,这两个的使用场景是什么?我这里主要针对的是MySQL,也许可能在别的引擎就不一定,比如别的搜索引擎会不会对count(*)有优化这个我就不确定。

首先你要你要知道这个count()是一个聚合函数,括号里面不仅仅可以填*和1还可以填别的比如说字段什么的。count(1)如果你给的条件是主键是有速度提升的,而count(*)即使不给主键作为条件的话,SQL也会自动优化。


大致的意思
count(字段),根绝字段判断为不为不空,根据字段定义,考虑要不要累加返回值,既然你引擎都返回值了,那我server层 “ +1 ”
count(id),根据id主键取值,累加返回值,也是server层 “ +1 ”
count(1),同样会遍历,但不取值,引擎告诉不为空那我就 “+1”
count(*),也不取值,而且人家还是经过优化的

根据上面的推倒,搜主键肯定比搜正常字段快, 不取值的一定比取值的快(我就是查数统计一下,你给我这一行所有的值也没啥用啊), 优化过的比没优化过的快

以下排行是按照效率,而不是时间
count(*) >或(≈) count(1) > count(id) > count(字段)

反正我觉得count(*)不错,我再本地测试的时候分析性能的时候(数据量不大,且条件不是主键,基本二者差不多有的时候count(*) 可能会快一点。)
 ————————————————

原文参考:https://blog.csdn.net/FeiChangWuRao/article/details/89493516

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值