【Mysql学习笔记】count(1)、count(*)、count(id)和count(字段)

37 篇文章 1 订阅

reference1
reference2

  1. count(1),表示扫描表,count(1)它在扫描到一行时不会取任何值,而是直接返回一个1,然后累加1的个数。
  2. count(),MyISAM引擎中直接在磁盘存了表的总行数,因此执行count()的时候直接返回总行数;InnoDB引擎中没有直接存表的总行数,因为执行count()的时候需要把数据一行一行地从引擎里读出来,然后累积计数,但是mysql对count()做了优化。官方文档说过,count(1)和count(*),MySQL的优化是完全一样的,根本不存在谁更快。
  3. count(id),取出每一行数据把id值返回给server层,因为id不可能为null,因此直接累加。
  4. count(字段),对于可以为null的字段取出后还需要判断,因此会慢。

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

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

单看这两个用法的差别的话,你能对比出来,count(1)执行得要比count(主键id)快。因为从引擎返回id会涉及到解析数据行,以及拷贝字段值的操作。

所以结论是:按照效率排序的话,count(字段)<count(主键id)<count(1)≈count(),建议使用count()。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值