当前位置: 首页 > news >正文

16 “count(*)“ 和 “count(1)“ 和 “count(field1)“ 的差异

前言

经常会有面试题看到这样的问题 “ select count(*) ”, “ select count(field1) ”, “ select count(1) ” 的效率差异啥的

然后 我们这里 就来探索一下 这个问题

我们这里从比较复杂的 select count(field1) 开始看, 因为 较为复杂的处理过程 会留一下一些关键的调试的地点, 然后根据这些地点去参照看一下 其他的查询 在这些地点分别都是怎么做的?

 

 

“ select count(field1) ” 的实现

首先是语法解析这边, 将 field1 解析为一个 PTI_in_sum_expr 里面包含了 field1 的 token 和 location 等等 

0303b8a80115467189848a8849e37f77.png

 

然后就是后面将 PTI_in_sum_expr resolve 成为 Item_field, 当然 这里也仅仅是维护了 field1 的 token 的相关信息, 后面才会填充 table 等等信息 

bc893b0e88f24cb69fc8ed04cac85542.png

 

然后是根据上下文填充目标字段的 table 的信息, field 的信息 

537342954bc6422cabcd41d6fc4e73af.png

 

然后就是迭代符合条件的记录, 然后根据给定的字段是否为空的信息, 来判断是否统计计数 

80e999c8cf56423f9d3c742c440532e3.png

 

然后判断 是否为空的标准为, 字段值是否是 NULL 

对应的处理方式如下 

5c450f93492e47c5b893b96b16c1a0ff.png

 

 

“ select count(*) ” 的实现

首先是语法解析这边, 将 * 解析为 NULL, 这里上下文包含了 location 的相关信息

2370993fab754f268dcbab01d77baf17.png

 

sql 解析完成之后, args[0] 之前为 NULL, 被更新为了 “Item_int(0)”

b6c5d5dcd6b84e16b8f8639de8022f4f.png

 

然后 setup_fields 这边, 没有做 太多的事情, Item_int 这边的 fix_fields 这边是走的默认处理 Item::fix_fields

d3c0cbc85f554bcbbaaa03675de45d3f.png

 

Item::fix_fields 的处理如下, 仅仅是一个标记的更新 

ad2aa5e465274d5c9b8b850b19497f31.png

 

然后就是迭代符合条件的记录, 然后根据给定的字段是否为空的信息, 来判断是否统计计数 

60bf166d50a84834b63592278dcdacf5.png

 

判断是否为空的判断标注哪位, 恒不为空 

类似于一个基本数据类型的 int 值为 0, 恒不为 NULL

eae65e9f9b6a4f8593acb27cf25e1f44.png

 

 

“ select count(1) ” 的实现

首先是语法解析这边, 将 1 解析为 PTI_in_sum_expr 里面 PTI_num_literal_num 包含了长了常量 ”1”, 这里上下文包含了 location 的相关信息

68dc01aca8c84d92b0cb60b4e1942a5c.png

 

然后 setup_fields 这边, 没有做 太多的事情, Item_int 这边的 fix_fields 这边是走的默认处理 Item::fix_fields

3b8300ff1c6a4980b16e95495da32e51.png

 

然后就是迭代符合条件的记录, 然后根据给定的字段是否为空的信息, 来判断是否统计计数 

PTI_num_literal_num 这边判断为不为空的方式也是基于 Item::is_null, 也是恒不为空 

dc45b9884d904875b3bc01d1c69162ca.png

 

 

“ select count(“1“) ” 的实现

其他的我们就不去看了, 仅仅看一下 Item_sum_count::add 这边的上下文 

解析出来的 对象有所调整, 但是结果不变, PTI_text_literal_text_string 这边判断为不为空的方式也是基于 Item::is_null, 也是恒不为空 

0fb832d4f4fb49279f8d456f9d0017cc.png

 

 

“ select count(NULL) ” 的实现

其他的我们就不去看了, 仅仅看一下 Item_sum_count::add 这边的上下文 

解析出来的 对象有所调整, 但是结果不变, Item_null 这边判断为不为空的方式是基于 Item_null::is_null, 是恒为空 

因此 最终的查询结果为 0

85309490573347fba623e504312e7c87.png

 

然后 Item_null::is_null 的处理方式如下, 恒为空 

5e034727ea1a4f71bb04afd9d3d0e3dc.png

 

 

总结

大致可以分成两类, “ select count(field1) ” 和 ”其他select count” 

影响效率的差异主要在于 是否是全表扫描, 扫描的是聚簇索引还是非聚簇索引

假设是索引扫描, 则几者的差异并不大, 主要的差异在于 比较的时候前者复杂一点, 后者快一点, 但是扫描的记录数量有限, 效率影响不大 

假设是全表扫描, 主要的影响就是 “ select count(field1) ” 是走聚簇索引, 还是非聚簇索引了, 然后 “其他select count” 会优先选择较小的非聚簇索引, 造成的影响主要是 io 的开销, 走非聚簇索引所需要的 io 较小

 

 

完 

 

 

 

相关文章:

16 “count(*)“ 和 “count(1)“ 和 “count(field1)“ 的差异

前言 经常会有面试题看到这样的问题 “ select count(*) ”, “ select count(field1) ”, “ select count(1) ” 的效率差异啥的 然后 我们这里 就来探索一下 这个问题 我们这里从比较复杂的 select count(field1) 开始看, 因为 较为复杂的处理过程 会留一下一些关键的调试…...

【云原生进阶之PaaS中间件】第一章Redis-1.4过期策略

1 设置带过期时间的 key # 时间复杂度:O(1),最常用方式 expire key seconds# 字符串独有方式 setex(String key, int seconds, String value)除了string独有设置过期时间的方法,其他类型都需依靠expire方法设置时间&a…...

windows弹出交互式服务检测一键取消bat脚本

现象 脚本命令 新建一个bat文件,将下面的脚本拷贝进去,保存,双击即可 禁用服务:重启电脑的时候不会启动 停止服务:立即停止服务,马上生效的 sc config UI0Detect start disabled net stop UI0Detect...

接口使用的最佳时机

1. 引言 接口在系统设计中,以及代码重构优化中,是一个不可或缺的工具,能够帮助我们写出可扩展,可维护性更强的程序。 在本文,我们将介绍什么是接口,在此基础上,通过一个例子来介绍接口的优点。…...

freertos之任务运行时间统计实验

这里写目录标题 任务时间统计函数时间统计API函数使用流程实验 任务时间统计函数 void vTaskGetRunTimeStats(char * pcWriteBuffer); 时间统计API函数使用流程 实验 1.首先现在FreeRTOSConfig.h文件里将configGENERATE_RUN_TIME_STATS 和configUSE_STATS_FORMATTING_FUNCTIO…...

Js中一些数组常用API总结

前言 Js中数组是一个重要的数据结构,它相比于字符串有更多的方法,在一些算法题中我们经常需要将字符串转化为数组,使用数组里面的API进行操作。本篇文章总结了一些数组中常用的API,我们把它们分成两类,一类是会改变原…...

LlamaIndex:将个人数据添加到LLM

推荐:使用 NSDT场景编辑器 快速搭建3D应用场景 LlamaIndex是基于大型语言模型(LLM)的应用程序的数据框架。像 GPT-4 这样的 LLM 是在大量公共数据集上预先训练的,允许开箱即用的令人难以置信的自然语言处理能力。但是,…...

Mojo 摸脚语言,似乎已经可以安装

文章原地址:https://i.scwy.net/it/2023/090821-mojo/ Mojo 吹得很凶,面向AI编程,甩Python几十条街,融资上亿.... 但无缘一试,在Win和Ubuntu上试都不能通过。 由 LLVM 和 Swift 编程语言的联合创始人 Chris Lattner…...

Spark 6:Spark SQL DataFrame

SparkSQL 是Spark的一个模块, 用于处理海量结构化数据。 SparkSQL是用于处理大规模结构化数据的计算引擎 SparkSQL在企业中广泛使用,并性能极好 SparkSQL:使用简单、API统一、兼容HIVE、支持标准化JDBC和ODBC连接 SparkSQL 2014年正式发布,当…...

区块链智能合约编程语言 Solidity

文章目录 前言Solidity 介绍Solidity 文件结构许可声明编译指示数据类型函数事件访问区块元数据 简单的智能合约 前言 上文介绍了区块链生态发展,我们知道以太坊的到来可以使开发人员基于区块链开发DApp,本文介绍 Solidity 编程语言的使用,然…...

将SSL证书设置成HTTPS的详细步骤

在互联网上建立一个安全且可信任的网站,HTTPS是一种常用的解决方案。HTTPS是HTTP的安全版本,通过使用SSL/TLS协议对传输的数据进行加密,确保数据传输的安全性。要实现HTTPS,你需要将SSL证书设置到你的网站上。以下是详细的步骤&am…...

43、Flink之Hive 读写及详细验证示例

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…...

2023数模国赛C 题 蔬菜类商品的自动定价与补货决策-完整版创新多思路详解(含代码)

题目简评:看下来C题是三道题目里简单一些的,考察的点比较综合,偏数据分析。涉及预测模型和运筹优化(线性规划),还设了一问开放型问题,适合新手入门,发挥空间大。 题目分析与思路: 背景&#x…...

javaScript:DOM中常用尺寸

目录 前言(可以根据图示找到需要的尺寸,便于理解) 内尺寸 clientWidth 包含左右padding和宽度width(忽略滚动条的宽度) clientHeight 包含上下padding和height(忽略滚动条的高度) clientTo…...

决策树算法学习笔记

一、决策树简介 首先决策树是一种有监督的机器学习算法,其采用的方法是自顶向下的递归方法,构建一颗树状结构的树,其具有分类和预测功能。其基本思想是以信息熵为度量构造一棵熵值下降最快的树,到叶子节点处的熵值为零。决策树的构…...

Verilog_mode常用的几个用法

一:verilog mode中如何使用正则表达 在顶层实例化时,有大量的信号需要重新命名,使用模板的话会增加大量的注释内容,不过往往这些信号命名有特定的规律,我们可以使用正则表达式来处理,下面举几个例子&#…...

MySQL之MHA高可用配置及故障切换

目录 一、MHA概念 1、MHA的组成 2、MHA的特点 3、主从复制有多少种复制方法 二、搭建MySqlMHA部署 1.Master、Slave1、Slave2 节点上安装 mysql 2.修改 Master、Slave1、Slave2 节点的 Mysql主配置文件/etc/my.cnf 3. 配置 mysql 一主两从 4、安…...

java实现状态模式

状态模式是一种行为设计模式,它允许对象在内部状态改变时改变其行为。在状态模式中,对象将其行为委托给表示不同状态的状态对象,这些状态对象负责管理其行为。以下是在 Java 中实现状态模式的一般步骤: 创建一个状态接口&#xff…...

Selling a Menagerie(cf)

该题考察了拓扑排序dfs 题意:你是一个动物园的主人,该动物园由编号从1到n的n只动物组成。然而,维护动物园是相当昂贵的,所以你决定卖掉它!众所周知,每种动物都害怕另一种动物。更确切地说,动物…...

python-55-打包exe执行

目录 前言一、pyinstaller二、实践打包exe1、遇坑1:Plugin already registered2、遇坑2:OSError 句柄无效 三、总结 前言 你是否有这种烦恼? 别人在使用你的项目时可能还需要安装各种依赖包?别人在使用你的项目,可能…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...

Spring Boot面试题精选汇总

🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

什么是EULA和DPA

文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...