《MySQL——count()逻辑》

count()用法

count()语义:该函数为一个聚合函数,对于返回的结果集一行行地判断,如果count函数地参数不是NULL,累计值就加1,否则不加。最后返回累计值。
所以count(*),count(主键id)和count(1)都表示返回满足条件地结果集地总行数;
而count(字段)则表示返回满足条件地数据行里面,参数“字段”不为NULL的总个数。

count(主键id)
InnoDB引擎会遍历整张表,把每一行的id值都取出来,返回给server层。
sever层拿到id后,判断id是不可能为空的,就按行累加

count(1)
InnoDB引擎遍历整张表,但不取值。server层对于返回的每一行,放一个数字“1”进去,判断是不可能为空的,按行累加

count(字段)
1、如果这个字段定义为not null的话,一行行地从记录里面读出这个字段,判断不能为null,按行累加
2、如果这个字段允许为null,那么在执行的时候,要判断字段是否为null,不是null才累加

count(*)
不会把全部字段取出来,而是专门做了优化,不取值。并且count(*)肯定不是null,按行累加。

所以按照效率排序的话: count(字段) < count(主键id) < count(1) 约等于 count(*)

InnoDB是支持事务的,MyISAM不支持事务。
InnoDB每一行记录都要判断自己是否对这个会话是否可见,所以对于count(*)请求来说,InnoDB只好把数据一行一行地读出依次判断,可见地行才能够用于计算“基于这个查询”地表地总行数。

猜你喜欢

转载自blog.csdn.net/qq_42604176/article/details/115399498
今日推荐