数据库的使用中,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(字段),非主键字段,这样的使用方式最好不要出现,因为它不会走索引。

SQL中的三种count()函数相关推荐

  1. SQL中的三种去重方法

    在使用SQL提数的时候,常会遇到表内有重复值的时候,比如我们想得到 uv (独立访客),就需要做去重. 在 MySQL 中通常是使用 distinct 或 group by子句,但在支持窗口函数的 s ...

  2. SQL 中 Rank、row_number、dense_rank 三种排序函数的区别

    现有一张工资表,需要对其进行排名,工资相同的人并列排名,然后再排名,很多刚接触的小伙伴估计第一时间想到Rank()函数或row_number() 函数,但是结果出来后并不是自己想要的,在这里就给大家介 ...

  3. pdo_fetch执行mysql_PDO中执行SQL语句的三种方法

    在PDO中,我们可以使用三种方式来执行SQL语句,分别是 exec()方法,query方法,以及预处理语句prepare()和execute()方法~大理石构件来图加工 在上一篇文章<使用PDO ...

  4. oracle hash join outer,CSS_浅谈Oracle中的三种Join方法,基本概念 Nested loop join: Outer - phpStudy...

    浅谈Oracle中的三种Join方法 基本概念 Nested loop join: Outer table中的每一行与inner table中的相应记录join,类似一个嵌套的循环. Sort mer ...

  5. 061 hive中的三种join与数据倾斜

    一:hive中的三种join 1.map join 应用场景:小表join大表 一:设置mapjoin的方式: )如果有一张表是小表,小表将自动执行map join. 默认是true. <pro ...

  6. C#中的三种委托方式:Func委托,Action委托,Predicate委托

    C#中的三种委托方式:Func委托,Action委托,Predicate委托. Func,Action,Predicate全面解析 首先来说明Func委托,通过MSDN我们可以了解到,Func委托有如 ...

  7. SQL去重的三种方法汇总

    SQL去重的三种方法汇总 这里的去重是指:查询的时候, 不显示重复,并不是删除表中的重复项 1.distinct去重 注意的点:distinct 只能一列去重,当distinct后跟大于1个参数时,他 ...

  8. Oracle的join默认为,Oracle中的三种Join方法详解

    这里将为大家介绍Oracle中的三种Join方法,Nested loop join.Sort merge join和Hash join.整理出来以便帮助大家学习. 基本概念 Nested loop j ...

  9. MySQL buffer pool中的三种链

    三种page.三种list.LRU控制调优 一.innodb buffer pool中的三种页 1.free page:从未用过的页 2.clean page:干净的页,数据页的数据和磁盘一致 3.d ...

最新文章

  1. android 后台Activity移到前台
  2. EOS 智能合约源代码解读 (4)symbol.hpp
  3. Elasticsearch系列「」学习路线
  4. Flink Operator之CoGroup、Join以及Connect
  5. Keras入门实战(1):MNIST手写数字分类
  6. 到底梅西和C罗谁更强?分析7年大赛数据后,才知道谁在巅峰
  7. Unity Shader: 理解Stencil buffer并将它用于一些实战案例(描边,多边形填充,反射区域限定,阴影体shadow volume阴影渲染)
  8. android升序降序按钮,创建一个按钮,将排序MYSQL查询升序和降序
  9. EChart绘制风速风向曲线分析图
  10. 超过 C++、压制 Java 与 C,Python 拔得 TIOBE 年度编程语言!
  11. 根据MAC地址修改固定IP(附带IPMAC扫描脚本)
  12. visual studio 高级选项及配置
  13. teechart绘制实时曲线_基于OpenCV的显著图绘制
  14. sqlite3命令行把.db文件导成.txt时报错及中文乱码
  15. ORBSLAM3 VIO初始化
  16. 数字电路:设计《三个开关控制一个灯的电路》
  17. MATLAB三维散点图的绘制函数详解(scatter3、plot3) (有示例)
  18. chrome 下载 中断_如何在Google Chrome浏览器中恢复中断的下载
  19. java nio wakeup_Java NIO的wakeup剖析
  20. 【程序人生】《你相信上帝的存在吗?》

热门文章

  1. 关于高德地图地理围栏生成后在BroadcastReceiver的onReceive方法中没有接收到消息的问题
  2. JetBrains IDEA 创建的包一直在同一级的问题解决方法
  3. Elasticsearch 平滑下线节点实践指南
  4. 程序员在行业内通常分为以下几个级别
  5. 309 复制单级文件夹
  6. MFC获取文件及文件夹
  7. React event.preventDefault使用方法
  8. OSX安装MacPorts
  9. 运动会加油稿计算机学院,大学运动会加油稿
  10. 一程序员爸爸呼吁,不要从小教孩子学编程