面试问你count(*)和count(1)哪个效率高别说你不会
上次面试,面试官最后问的我这个问题,然后凉凉了,现在在这里总结一下。
count的实现方式
- 在Mysql中的不同的存储引擎对count函数有不同的实现方式。
MyISAM引擎把一个表的总行数存在了磁盘上,因此执行count()的时候会直接返回这个数,效率很高(没有where查询条件)。
InnoDB引擎并没有直接将总数存在磁盘上,在执行count()函数的时候需要一行一行的将数据读出来,然后累计总数。
- 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()。」
还没有评论,来说两句吧...