目录
2、select count(*)和select count(1)
1、select * 和select 1
语法:select * from 表名称;
查询出表的所有数据,是返回所有行的所有列,性能比select 1差。
语法:select 1 from 表名称;
查询出结果是所有记录数的常量,性能比select *高;对应所有行,返回的永远只有一个值,即常量,所以正常只会用来判断是否有还是没有。
如果要返回数据,使用select * ,如果要判断有没有结果使用select 1;
2、select count(*)和select count(1)的区别
语法:select count(*) from 表名称;
count(*) 表示所有记录,这个返回值是否为空都会计算总数
语法:select count(1) from 表名称;
count(1) 1表示主键,统计主键列(主键肯定非空的)
一般情况下,select count(*)和select count(1)两个返回的结果是一样的。在数据记录都不为空的时候查询出来结果上没有差别的。但当count(1)查询的那列有空的时候空的是要被去掉的不计入统计中。这样查询出来的结果是不一样的。
1、执行效率上:
他们之间根据不同情况会有些许区别,MySQL 会对count(*)做优化。
- 如果表中只有一列,则count(* )效率最优。
- 如果表有多列,且存在主键,count (列名)效率最优,顺序是:count (列名)>count (1) >count( *)。
- 如果表有多列,且不存在主键,则count(1 )效率优于count( *)
2、从执行结果来说:
- count(1)和count (*)之间没有区别,因为count (*) count (1)都不会去过滤(排除)空值
- count (列名)会过滤空值。
使用count()聚合函数的注意事项:
阿里巴巴开发手册:
1、如果在开发中需要用到count()聚合,那么优先考虑count(*),因为mysql本身对于count(*)做了特别的优化处理。
列名为主键,count(列名)会比count(1)快
列名不为主键,count(1)会比count(列名)快
如果表多个列并且没有主键,则 count(1) 的执行效率优于 count(*)
如果有主键,则 select count(主键)的执行效率是最优的
如果表只有一个字段,则 select count(*)最优
2、使用count()聚合函数后,最好不要跟where age = 1;这样的条件,会导致不走索引,降低查询效率。除非该字段已经建立了索引。使用count()聚合函数后,若有where条件,且where条件的字段未建立索引,则查询不会走索引,直接扫描了全表。
3、count(字段),非主键字段,这样的使用方式最好不要出现,因为它不会走索引。
主键的作用:
- 保证实体的完整性;
- 加快数据库的操作速度
- 在表中添加新记录时,数据库会自动检查新记录的主键值,不允许该值与其他记录的主键值重复。
- 数据库自动按主键值的顺序显示表中的记录。如果没有定义主键,则按输入记录的顺序显示表中的记录。
主键不是非要不可,可以从这两个角度权衡是否需要主键:
- 是否满足业务要求
- 数据查询效率(主键可以提高查询效率,当然合理的索引替代也可以)
参考:
COUNT函数的使用_数据库count函数的用法_秃头也是强的博客-CSDN博客
count(*) count(1)与count(字段)的区别_count(1)与count(*)区别_丿剑过血洒泪轻吟的博客-CSDN博客