亲测: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