性能对比:Count(字段)、Count(主键)、Count(1)、Count(*)
本文经授权转载自微信公众号:猿人谷
最近有几个小伙伴留言说不清楚Count(字段)、Count(主键)、Count(1)、Count(*)的区别,特此写篇短文说明下。
以下讨论是基于InnoDB引擎。
至于分析性能差别的时候,可以记住以下几个原则:
server层要什么就给什么;
InnoDB只给必要的值
现在的优化器只优化了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(*)相关推荐
- oracle查询表的字段类型有哪些,oracle中查询表的信息,包括表名,字段名,字段类型,主键(精)...
通过搜索摸索,总结了一下 oracle 中查询表的信息,包括表名,字段名,字段类型,主键, 外键唯一性约束信息,索引信息查询 SQL 如下,希望对大家有所帮助: 1.查询出所有的用户表 select ...
- 《软件开发性能优化系列》之主键、索引设计
无主键.索引或者没有查询索引无效,是产品查询慢的最常见问题,以下是数据库表主键和索引设计的主要原则 1.主键 主键ID,主键既是约束也是索引,同时也用于对象缓存的键值. 2.索引 *组合或者引用关系的 ...
- sql更新表的字段和主键
/*不能在设计表中直接添加键的约束*/ /*添加主键时,如果主键可为空,则必须首先设置表的主键字段不为空*/ ALTER TABLE s_User2Subject alter column User2 ...
- mysql创建主键索引的关键字使用_mysql字段、主键、索引等的创建与修改命令
//主键 alter table tabelname add new_field_id int(5) unsigned default 0 not null auto_increment ,add p ...
- mysql用命令修改主键名_MySQL的常用命令:添加外键,修改字段名称,增加字段 设置主键自增长等...
Mysql命令添加外键 前提是有这么几个表 以mall_product 和 mall_category为例 ALTER TABLE mall_product ADD CONSTRAINT fore ...
- java导出数据库的结构 表结构 字段信息 主键
工作之余,用java写了一个导出数据库结构的小工具,附上核心代码 Table.java package org.dev.livvy.db; import java.util.List; /** * C ...
- sqlserver 建表指定主键_3-自增字段;主键约束
按照上表写出一条建表语句 ①id字段为整型数据,主键约束,自增 ②dt字段为日期格式,非空 ③weather字段为可变长度字符串,最大长度为30,非空 ④min_tem与max_tem字段为整型数据, ...
- Oracle 使用序列插入表自增字段(主键)
序列(Sequence) 是序列号生成器,可以为表中的行自动生成序列号,产生一组等间隔的数值(类型为数字).不占用磁盘空间,占用内存. 其主要用途是生产表的主键值,可以在插入语句中引用,也可以通过查询 ...
- mysql用命令修改主键名_MySQL的常用命令:添加外键,修改字段名称,增加字段 设置主键自增长等 落楝花...
Mysql命令添加外键 前提是有这么几个表 以mall_product 和 mall_category为例 ALTER TABLE mall_product ADD CONSTRAINT fore ...
最新文章
- 学会 IDEA REST Client后,postman就可以丢掉了...
- 最大熵模型:读书笔记
- Chatbot大牛推荐:AI、机器学习、深度学习必看9大入门视频
- url、base64、blob,三者之间的转化
- oracle存储过程 ppt,oracle_存储过程培训(动画版本)详解.ppt
- Vue 组件 data为什么是函数
- 半个月使用rust语言的体验
- 为什么要编写轻量级的View Controller??
- c语言计算圆周率的方法,c语言学习之不同方式计算圆周率
- 如何自学成为程序员?
- 键盘符号中英文对照表
- 计算机网络病毒防范,计算机网络病毒的十项防范措施
- 坦克世界没有服务器信号,坦克世界闪击战无法连接服务器怎么办 网络问题
- verilog 握手机制学习记录
- 明解C语言入门篇_第9章_字符串的基本知识
- 正方教务管理系统后台敏感日志查看漏洞
- 使用php的GD库拼接图片
- 什么是招标控制价?与标底价有什么区别
- 莫拉克电梯服务器说明书_默纳克操作手册
- Vue全家桶系列之Vuex(三)
热门文章
- isvisible java_.NET(C#) Selenium操作调用浏览器判断页面元素(ElementIsVisible)可见的方法...
- eclipemaven本地仓库依赖_【Maven】解决本地jar依赖
- IDA Python On MACOS 使用系统的python
- 操作系统之内存管理:1、内存管理基础知识(指令工作原理、地址转化、程序运行过程)
- (操作系统题目题型总结)第四章:存储管理
- (软件工程复习核心重点)第二章可行性研究-第一节:可行性研究基本介绍
- 6-6-3:STL之map和set——multiset和multimap及set和map在oj题中的用处
- 快速幂(求A^B的最后三位数表示的整数(A^B的含义是A的B次方))(java)
- LeetCode 934 最短的桥
- DRAM与SRAM的比较