面试问你count(*)和count(1)哪个效率高别说你不会

- 日理万妓 2021-06-22 15:38 449阅读 0赞

上次面试,面试官最后问的我这个问题,然后凉凉了,现在在这里总结一下。
count的实现方式

  1. 在Mysql中的不同的存储引擎对count函数有不同的实现方式。

MyISAM引擎把一个表的总行数存在了磁盘上,因此执行count()的时候会直接返回这个数,效率很高(没有where查询条件)。
InnoDB引擎并没有直接将总数存在磁盘上,在执行count(
)函数的时候需要一行一行的将数据读出来,然后累计总数。

  1. count()是一个聚合函数,对于返回的结果集,一行行地判断,如果count函数的参数不是NULL,累计值就加1,否则不加。最后返回累计值。
    count的用法有多种,分别是count(*)、count(字段)、count(1)、count(主键id)。那么多种用法,到底有什么差别呢?当然,「前提是没有where条件语句」。

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

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

count(字段):
如果这个“字段”是定义为not null的话,一行行地从记录里面读出这个字段,判断不能为null,按行累加;
如果这个字段定义允许为null,那么执行的时候,判断到有可能是null,还要把值取出来再判断一下,不是null才累加。

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

所以结论很简单:「按照效率排序的话,count(字段)<count(主键id)<count(1)≈count(),所以建议读者,尽量使用count()。」

发表评论

表情:
评论列表 (有 0 条评论,449人围观)

还没有评论,来说两句吧...

相关阅读