SQL中的三种count()函数
·
数据库的使用中,Count() 函数用于统计数据表的记录,返回匹配指定条件的行数。
三种Count() 函数 count(1)、count(*)、count(列名) 区别
1、 count(1)、count(*)
数据表的数据量很大时,对数据表作分析,使用 count(1) 比使用 count(*) 用时多。从执行计划看, count(1)、count(*)的效果是相同的,但实际 count(1)的执行用时相对较少(1w以内数据量)。如果count(1)是聚索引,id,那肯定是count(1)快,但是差的很小。因为 count(*) 会自动优化指定到某一个字段,所以没必要用count(1),用count(*) sql 会帮你完成优化,因此 count(1)和count(*)基本没有差别!
2、count(1)、 count(列名)
这两者的主要区别是:count(1) 统计的是数据表中的所有记录数,包含字段为 null 的记录;count(列名) 统计的是该字段在该表中出现的次数,会忽略字段为 null 的情况,不统计空记录。
3、count(1)、count(*)、count(列名)
在执行效果上:
- count(*)包括了所有的列,返回表格中所有存在的行的总数包括值为null的行;
- count(1)是用1代表代码行,在统计结果时,不会忽略列值为NULL ;
- count(列名)只包括指定列名的计数(有默认值的列也会被计入),在统计结果时,会忽略列值为空(这里的空不是指空字符串或者0,而是null)的计数,即某个字段值为NULL时,不统计。
在执行效率上:
- 列名为主键时,count(列名)会比count(1)快 ,count(1) 和 count(主键) 一样,只扫描主键;
- 列名不为主键时,count(1)会比count(列名)快 ;
- 如果表中有多个列并且没有主键,则 count(1) 的执行效率优于 count(*)
- 如果有主键,则 select count(主键)的执行效率是最优的
- 如果表只有一个字段,则 select count(*)最优。
count(主键) 不一定比count(其余索引) 快:
索引是一种B+树的结构,以块为单位进行存储。假设块大小是1K,主键索引大小为4B,有一个字段A的索引大小为2B。 同样一个块,能存放256个主键索引,但是能存放512个字段A的索引。 假设总数据是2K条,意味着主键索引占用了8个块,而A字段索引占用了4个块,统计时用主键索引需要经历的块多,IO次数多,效率也比A字段索引慢。
Count() 函数总结
- (1) 如果在开发中确实需要用到count()聚合,那么优先考虑count(*),因为mysql数据库本身对于count(*)做了特别的优化处理。
- (2) 使用count()聚合函数后,最好不要跟where age = 1 这样的条件,会导致不走索引,降低查询效率,除非该字段已经建立了索引。使用count()聚合函数后,若有where条件,且where条件的字段未建立索引,则查询不会走索引,直接扫描了全表。
- (3) count(字段),非主键字段,这样的使用方式最好不要出现,因为它不会走索引。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)