关于COUNT(*)和COUNT(1) – 个人总结
前言
昨天闲着无事,朋友写代码用的是COUNT(*),我上去插了一嘴,这个COUNT( )如果是 * 那么是查全局的,用COUNT(1)会好一点。
然后我朋友说,你怎么知道的呢,我想了想,以前好像看过文章是这么说的。
尴尬啊,我睡不着了,我一定要看看资料。大早上又看了很多资料,不行我一定要写个博客。下次不能再被怼了
参数
- Count(*)或者Count(1)或者Count([列])聚合函数
- Count()定义:查找调数是否为NULL 如果为NULL就不计数,如果不为NULL就记录条数;
论证
-
select count(字段) from test;
当字段不为空时,遍历,每读取一条记录count总数加1;
当字段允许为null ,每读取一条记录,先判断是否为null,不为null时将count总数加1。 -
.select count(主键id) from test;
由于id是主键,具有唯一属性,所以只需要遍历主键索引,过程中不需要判断是否null,每读取一条记录将count总数加1。 -
select count(1) from test;
遍历整张表,但不取具体的行数据到内存,对于每返回的一行,处理器都放一个数字’1’进去,最多每一行数据汇总。 -
select count() from test;
遍历整张表,但对于count(),MySQL做了优化,不会读取具体的行数据,只要读取到一行,按行累加。
总结
正常查询情况下,使用都一样。尴尬按习惯来吧