count函数是MySQL中最常用的函数,其作用主要是用来统计结果集中的行数。
count()函数有三种常见用法:
1)count(*) 返回满足查询条件的结果集的行数;
2)count(常量) 跟count(*)一样;
3)count(字段) 返回满足查询条件且相关列不为NULL的结果集行数;
由上可以看出,最简单的区别是,用列名做参数时,相关列为NULL的行是不会算进统计结果的。那他们在性能上有区别吗?
count(*) 是SQL92定义的标准统计行数的语法,所以MySQL数据库对他进行过很多优化。
1)MyISAM引擎,MyISAM数据库是表级锁,不会有并发的数据库行数修改,所以MyISAM做了一个简单的优化,将表的总行数单独记录了下来,查询时,直接返回这个值就可以了;
2)InnoDB引擎,InnoDB支持事务,其大部分操作都是行级锁,因此无法记录表的总行数。但是InnoDB会选取一个最小的非聚簇索引来进行全表扫描,从而提高效率,节省时间。
当然上述的优化都是在没有where和group的条件下进行的。
count(1)与count(*) 的区别众说纷纭,在MySQL官方文档上,说两者的优化是一样的,没有区别,但还是建议使用count(*);
count(字段) 则是直接扫描全表,然后判断字段的值是否为NULL,不为NULL则累加。因为多了一步判断NULL的过程,因此,其效率要低于count(*)
领取专属 10元无门槛券
私享最新 技术干货