本文经授权转载自微信公众号:猿人谷

最近有几个小伙伴留言说不清楚Count(字段)、Count(主键)、Count(1)、Count(*)的区别,特此写篇短文说明下。

以下讨论是基于InnoDB引擎。

至于分析性能差别的时候,可以记住以下几个原则:

  1. server层要什么就给什么;

  2. InnoDB只给必要的值

  3. 现在的优化器只优化了count(*)的语义为“取行数”,其它“显而易见”的优化并没有做。接下来,我们一个个来进行分析。

对于count(主键id)来说,InnoDB引擎会遍历整张表,把每一行的id值都取出来,返回给server层。server层拿到id后,判断是不可能为空的,就按行累加。

对于count(1)来说,InnoDB引擎遍历整张表,但不取值。server层对于返回的每一行,放一个数字“1”进去,判断是不可能为空的,按行累加。

单看这两个用法的差别的话,你就能对比出来,count(1)执行的要比count(主键id)快。因为从引擎返回id会涉及到解析数据行,以及拷贝字段值的操作

对于count(字段)来说:

  • 如果这个“字段”是定义为not null的话,一行行地从记录里面读出这个字段,判断不能为null,按行累加;

  • 如果这个“字段”定义允许为null,那么执行的时候,判断到有可能是null,还要把值取出来再判断一下,不是null才累加。也就是前面的第一条原则,server层要什么字段,InnoDB就返回什么字段。

但是count(*)是例外,并不会把全部字段取出来,而是专门做了优化,不取值。count(*)肯定不是null,按行累加。

看到这里,你一定会说,优化器就不能自己判断一下吗,主键id肯定非空啊,为什么不能按照count(*)来处理,多么简单的优化啊。

当然,mysql专门针对这个语句进行优化,也不是不可以。但是这种需要专门优化的情况太多了,而且mysql已经优化过count(*)了,直接使用这种用法就可以了。

所以结论是:按照效率排序的话,count(字段) < count(主键id) < count(1) ≈ count(*)。所以建议尽量使用count(*)

有道无术,术可成;有术无道,止于术

欢迎大家关注Java之道公众号

好文章,我在看❤️

性能对比:Count(字段)、Count(主键)、Count(1)、Count(*)相关推荐

  1. oracle查询表的字段类型有哪些,oracle中查询表的信息,包括表名,字段名,字段类型,主键(精)...

    通过搜索摸索,总结了一下 oracle 中查询表的信息,包括表名,字段名,字段类型,主键, 外键唯一性约束信息,索引信息查询 SQL 如下,希望对大家有所帮助: 1.查询出所有的用户表 select ...

  2. 《软件开发性能优化系列》之主键、索引设计

    无主键.索引或者没有查询索引无效,是产品查询慢的最常见问题,以下是数据库表主键和索引设计的主要原则 1.主键 主键ID,主键既是约束也是索引,同时也用于对象缓存的键值. 2.索引 *组合或者引用关系的 ...

  3. sql更新表的字段和主键

    /*不能在设计表中直接添加键的约束*/ /*添加主键时,如果主键可为空,则必须首先设置表的主键字段不为空*/ ALTER TABLE s_User2Subject alter column User2 ...

  4. mysql创建主键索引的关键字使用_mysql字段、主键、索引等的创建与修改命令

    //主键 alter table tabelname add new_field_id int(5) unsigned default 0 not null auto_increment ,add p ...

  5. mysql用命令修改主键名_MySQL的常用命令:添加外键,修改字段名称,增加字段 设置主键自增长等...

    Mysql命令添加外键 前提是有这么几个表   以mall_product 和 mall_category为例 ALTER TABLE mall_product ADD CONSTRAINT fore ...

  6. java导出数据库的结构 表结构 字段信息 主键

    工作之余,用java写了一个导出数据库结构的小工具,附上核心代码 Table.java package org.dev.livvy.db; import java.util.List; /** * C ...

  7. sqlserver 建表指定主键_3-自增字段;主键约束

    按照上表写出一条建表语句 ①id字段为整型数据,主键约束,自增 ②dt字段为日期格式,非空 ③weather字段为可变长度字符串,最大长度为30,非空 ④min_tem与max_tem字段为整型数据, ...

  8. Oracle 使用序列插入表自增字段(主键)

    序列(Sequence) 是序列号生成器,可以为表中的行自动生成序列号,产生一组等间隔的数值(类型为数字).不占用磁盘空间,占用内存. 其主要用途是生产表的主键值,可以在插入语句中引用,也可以通过查询 ...

  9. mysql用命令修改主键名_MySQL的常用命令:添加外键,修改字段名称,增加字段 设置主键自增长等 落楝花...

    Mysql命令添加外键 前提是有这么几个表   以mall_product 和 mall_category为例 ALTER TABLE mall_product ADD CONSTRAINT fore ...

最新文章

  1. 学会 IDEA REST Client后,postman就可以丢掉了...
  2. 最大熵模型:读书笔记
  3. Chatbot大牛推荐:AI、机器学习、深度学习必看9大入门视频
  4. url、base64、blob,三者之间的转化
  5. oracle存储过程 ppt,oracle_存储过程培训(动画版本)详解.ppt
  6. Vue 组件 data为什么是函数
  7. 半个月使用rust语言的体验
  8. 为什么要编写轻量级的View Controller??
  9. c语言计算圆周率的方法,c语言学习之不同方式计算圆周率
  10. 如何自学成为程序员?
  11. 键盘符号中英文对照表
  12. 计算机网络病毒防范,计算机网络病毒的十项防范措施
  13. 坦克世界没有服务器信号,坦克世界闪击战无法连接服务器怎么办 网络问题
  14. verilog 握手机制学习记录
  15. 明解C语言入门篇_第9章_字符串的基本知识
  16. 正方教务管理系统后台敏感日志查看漏洞
  17. 使用php的GD库拼接图片
  18. 什么是招标控制价?与标底价有什么区别
  19. 莫拉克电梯服务器说明书_默纳克操作手册
  20. Vue全家桶系列之Vuex(三)

热门文章

  1. isvisible java_.NET(C#) Selenium操作调用浏览器判断页面元素(ElementIsVisible)可见的方法...
  2. eclipemaven本地仓库依赖_【Maven】解决本地jar依赖
  3. IDA Python On MACOS 使用系统的python
  4. 操作系统之内存管理:1、内存管理基础知识(指令工作原理、地址转化、程序运行过程)
  5. (操作系统题目题型总结)第四章:存储管理
  6. (软件工程复习核心重点)第二章可行性研究-第一节:可行性研究基本介绍
  7. 6-6-3:STL之map和set——multiset和multimap及set和map在oj题中的用处
  8. 快速幂(求A^B的最后三位数表示的整数(A^B的含义是A的B次方))(java)
  9. LeetCode 934 最短的桥
  10. DRAM与SRAM的比较