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

news2024/11/29 18:39:48

前言

经常会有面试题看到这样的问题 “ 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 较小

 

 

完 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/991894.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C4D国潮场景3D模型合集

110个国潮场景3D模型,C4D源文件,部分效果图如下: 微信扫描下方二维码 回复关键字获取 100004

神经网络输出中间特征图

在进行神经网络的训练过程中,会生成不同的特征图信息,这些特征图中包含大量图像信息,如轮廓信息,细节信息等,然而,我们一般只获取最终的输出结果,至于中间的特征图则很少关注。 前两天师弟突然…

第24章 互斥锁实验(iTOP-RK3568开发板驱动开发指南 )

在上一章节中对信号量进行了学习,而本章节要学习的互斥锁可以说是“量值”为 1 的信号量,最终实现的效果相同,既然有了信号量,那为什么还要有互斥锁呢,带着疑问,让我们来进行本章节的学习吧! 2…

古尔曼表示不服?郭明錤:苹果可能不会在10月发布M3芯片的机型

9月9日消息,据天风证券分析师郭明錤所言,苹果可能不会在今年发布搭载M3芯片的MacBook Air/Pro机型。这一说法与此前彭博社的马克古尔曼所透露的消息有所不同。根据古尔曼的消息,苹果最快在10月会发布M3款苹果MacBook Air和Pro电脑。他表示&am…

美国封锁激励中国制造业数字化转型的崛起 | 百能云芯

上海在近日公布了第二批工赋链主培育企业名单,共有15家企业入选。这些被称为“链主”的企业在上海制造业数字化转型的过程中扮演着关键角色,类似于领头大雁,它们是上海制造业的数字化网络中的关键节点。 中新社的报道指出,“数字技…

软件源码开发,网络中的“摄像头”:运维监控系统

在日常生活中,我们不管是在大街小巷,还是在商场大厦都可以见到一个圆形或是方形带有镜片的“小盒子”,这个“小盒子”就是摄像头,摄像头作为一个能实时录制记录它能照到范围内的视频图像的工具,可以在丢失物品、抓捕坏…

判断动物知识竞猜答案正误

判断动物知识竞猜答案正误 教学目标 1. 知识与技能: 结合实例,理解选择结构。掌握if语句的基本格式,掌握关系运算符。 过程与方法: 学会使用if编程解决实际生活中的一些问题。 情感态度与价值观: 教…

通讯软件018——分分钟学会UaExpert OPC UA Client配置

本文介绍如何配置UaExpert OPC UA Client,通过本文可以对OPC UA的基本概念有所了解,掌握OPC UA的本质。相关软件请登录网信智汇(wangxinzhihui.com)。 创建OPC UA 连接 这里需要掌握一下OPC UA的安全机制。 1)安全模式: OPC UA安…

史上最详细的PyCharm安装教程,小白建议收藏!

前言:Hello大家好,我是小哥谈。PyCharm是由JetBrains公司开发的一款Python开发工具,在Windows、Mac OS和Linux操作系统中都可以使用,它具有语法高亮显示、Project(项目)管理、代码跳转、智能提示、自动完成…

初识集合框架 -Java

目录 一、集合框架的概念 二、集合框架的重要性 三、涉及的数据结构和算法 3.1 什么是数据结构 3.2 集合框架(容器)背后对应的数据结构 3.3 相关的Java知识 3.4 什么是算法 3.5 如何学好数据结构和算法 一、集合框架的概念 Java 集合框架,…

【图卷积神经网络】1-入门篇:为什么使用图神经网络(下)

为什么使用图神经网络? 在本书中,我们将重点介绍图学习技术中的深度学习家族,通常称为图神经网络。GNNs是一种新的深度学习架构类别,专门设计用于处理图结构化数据。与主要用于文本和图像的传统深度学习算法不同,GNNs明确地用于处理和分析图数据集(见图1.4)。 图1.4 - …

Vue3+Ts+Vite项目(第一篇)——使用Vite创建Vue3项目

概述 保姆级详解,带你使用 Vite 创建 Vue3 项目,全程cv即可 文章目录 概述一、 安装 Vite二、 创建项目2.1 运行上述命令后,会让我们输入项目名称。可以写一个 vue3-study2.2 选择项目模板,此处选择 Vue,然后回车确定…

无涯教程-JavaScript - IMPOWER函数

描述 IMPOWER函数以x yi或x yj文本格式返回加到幂的复数。求幂的复数的计算方法如下- $$(x yi)^ n r ^ ne ^ {n \theta} r ^ n \cos n \theta ir ^ n sin n \theta $$ 哪里- $$r \sqrt {x ^ 2 y ^ 2} \:\:和\:\:\theta \tan ^ {-1} \left(\frac {y} {x} \right)\:…

雅思写作 三小时浓缩学习顾家北 笔记总结(四)

目录 The company should provide maternity leave and other assistance to female employees with children. Community redevelopment provides opportunities for offenders to acquire vocational skills. The law should classify drunk driving as a criminal offens…

JavaScript对象方法

在 JavaScript 中,对象可以包含方法,即函数作为它的属性。这些被称为对象函数或方法。 例如: const ITshareArray {firstname: "张三",secondname: "二愣子",birthYear: "1996",job: "程序员",fri…

多元共进|科技促进艺术发展,助力文化传承

科技发展助力文化和艺术的传播 融合传统与创新,碰撞独特魅力 一起来了解 2023 Google 开发者大会上 谷歌如何依托科技创新 推动艺术与文化连接 传承和弘扬传统文化 自 2011 年成立以来,谷歌艺术与文化致力于提供体验艺术和文化的新方式,从生成…

SpringAOP面向切面编程

文章目录 一. AOP是什么?二. AOP相关概念三. SpringAOP的简单演示四. SpringAOP实现原理 一. AOP是什么? AOP(Aspect Oriented Programming):面向切面编程,它是一种编程思想,是对某一类事情的集…

热迁移技术-QEMU

社区有言Talk is cheep, show me the code,我们尽量低纬度描述技术。 代码和版本: Qemu-5.0 #热迁移技术的实现者 Kernel-4.19 #提供kvm实现 热迁移的演进 Qemu有加载保存vm的功能,这是两个互补的操作。保存状态就是为每个vm中运行的设备保存…

不同的二叉搜索树【动态规划】

不同的二叉搜索树 给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。 class Solution {//testpublic int numTrees(int n) {//初始化 dp 数组int[] dp new int[n 1];//初始化…

像素空间文生图之Imagen原理详解

论文:Photorealistic Text-to-Image Diffusion Models with Deep Language Understanding项目地址:https://imagen.research.google/代码(非官方):https://github.com/deep-floyd/IF模型权重:https://huggingface.co/DeepFloyd/IF-I-XL-v1.0🤗关注公众号 funNLPer 白嫖…