印象中,count(key)比count(*)效率要高,因此在项目中用了count(field)的形式来统计行数。在code reivew时被指出应用count(*),于是查了下,并做了下简单测试,果然是我记错了,足见code review是多么有用啊。

count(*)

count(*)是对不为null的行进行计数,因此某一行只要不是所有列都为null(即只要是存在的记录),就会被计数。

mysql用explain查看其执行计划,count(*)会尽量利用具有以下特征的索引来提高性能:

  1. not null列
  2. 字段较窄


如图所示,表主键id为bigint类型,count(*)时自动选择了int类型的gst_id索引。

count(field)

count(field)是对field列不为null的行进行统计,因此某一行的该列为null,则不予计数 。

同样用explain查看其执行计划,count(field)同样会尽量利用索引来提高性能,暂时发现有以下两种情况:

  1. 含有该field的索引
  2. 若改field为主键,则同count(*)一样,会选择更窄的索引,此时和使用count(*)无异

由此可见,用count(field)来进行统计会有以下问题:

  1. 若该field有null记录,意图用来统计所有记录时,结果是错误的
  2. 若该field没有索引或者不是最优索引,则效率会低

count(1)

还见到count(1)用法。mysql中验证没有发现与count(*)明显区别,暂且认为是一样的。

小结

count(*)和count(1)无太大差别,count(field)若使用不当会带来错误或性能问题,不建议使用。

另外,若含有where语句,则会优先where中条件索引,上面讨论的执行计划,应该没多大意义了。

count(*),count(1)和count(field)区别相关推荐

  1. Mysql之count(*),count(1),count(field)区别、性能差异

    目录 前言 COUNT(*)与 COUNT(1) MyISAM引擎中的COUNT(*)与 COUNT(1) Innodb引擎中的COUNT(*)与 COUNT(1) 实验 原理 结论 Count(1) ...

  2. select count(*) from temp 与select count(1) from temp有什么区别

    select count(*) from temp 与select count(1) from temp有什么区别 ----count(*)是整个表中有多少条记录,扫描的是整个表 ---- ----c ...

  3. select count(*) 和 select count(1) 以及 select count(column) 的区别

    考试,目的在于让自己明白,自己天天写的都是垃圾 select count(*) 和 select count(1) 以及 select count(column) 的区别 1.如果表沒有主键, 那么c ...

  4. SQL难点对比分析:COUNT(IF) 和 SUM(IF)的区别

    COUNT(IF) 和 SUM(IF) 的区别和联系: COUNT(IF xxx, 1, 0):无视条件求和,即统计0或者1的数量(因为不论0还是1,都是不为NULL的值) SUM(xxx, 1, 0 ...

  5. count(*)和count(1)和count(列名)的区别

    count是一种最简单的聚合函数,一般也是我们第一个开始学习的聚合函数,那么他们之间究竟由什么区别呢? 有的人说count(1)和count(*)他们之间有区别,而有的人说他们之间没有区别那么他们之间 ...

  6. count(*),count(1),count(列)区别

    执行效果: count(1) and count(*) 当表的数据量大些时,对表作分析之后,使用count(1)还要比使用count(*)用时多了! 从执行计划来看,count(1)和count()的 ...

  7. count(*)、count(1)和count(列名)的区别

    count(*).count(1)和count(列名)的区别 1.执行效果上:   l  count(*)包括了所有的列,相当于行数,在统计结果的时候,不会忽略列值为NULL l  count(1)包 ...

  8. sql count(1) count(*)区别_PostgreSQL的count(1)真的比count(*)快么?

    作者简介 张连壮,多年PostgreSQL数据库内核研发经验,高可用/数据复制方面经验较为丰富,目前主要从事分布式数据库Citus相关工作,CitusDB中国[站主]专注于Citus技术分享的全信息平 ...

  9. 数据库面试题【十九、count(字段) count(主键 id) count(1)count(*)的区别】

    count(可空字段) 扫描全表,读到server层,判断字段可空,拿出该字段所有值,判断每一个值是否为空,不为空则累加 count(非空字段)与count(主键 id) 扫描全表,读到server层 ...

最新文章

  1. 每日 30 秒之 对海量数据进行切割
  2. 在c语言中错误的常数表示是,C语言程序设计试题
  3. DCMTK:类DVPSIPCClient的示例消息服务器
  4. python os模块详细_python之os模块详解
  5. 树莓派使用STEP5:安装samba文件共享服务器
  6. windows客户端连接linux服务器上的postmaster
  7. 596. 超过5名学生的课
  8. Javaweb-标签介绍
  9. MATLAB —— polyfit()多项式曲线拟合(线性拟合/线性回归)
  10. 数学分析与高等代数考研真题详解--苏大卷
  11. Noip 2016 蛋碎一地晚节不保
  12. 感光度和灰阶测试—imatest
  13. 车辆出险保险索赔技巧——让每个车友都能学习
  14. Oracle新建的用户看不到表,oracle中用命令行新建的用户没法建表
  15. 已解决解决:consumer: Cannot connect to redis://localhost:6379//: Error 11001 connecting to localhost:6379
  16. Unity Shader - 羽化效果
  17. 凸函数的性质、判定,凸规划
  18. 基于PysimpleGUI+pymysql建立的简单管理系统(1)
  19. C#模拟百度登录并到指定网站评论回帖(三)
  20. 电子海图改正信息的计算和输入

热门文章

  1. AxureRP使用技巧
  2. android InputStream相关类
  3. 涨芝士:VScode如何在俩个窗口打开同一个项目(目录)
  4. 小米mix2s html,用小米MIX2S玩吃鸡?我劝你不要啦
  5. element 表格table纵横双列表头 斜线样式处理和多级表头循环
  6. ocm名单 oracle_OCM(Oracle认证数据库大师)
  7. xmake v2.6.2 发布,新增 Linux 内核驱动模块构建支持
  8. 解除游戏多开限制,关闭互斥体句柄
  9. 修改elementUI单选框默认值
  10. wmic csproduct 报错No Instance通过修复wmi解决