case when影响性能吗_字段为NULL会影响查询性能吗?

导读

假设这个用户中心系统是一个交友平台的一个子系统,现在产品想要提供一个按生日区间筛选用户的功能。那么,要实现这个功能,我们需要写这么一条SQL:

SELECT 

为了保证这条SQL的查询性能,我们会给用户表中的birthday字段添加索引。乍一看最初的表结构设计,好像已经有一个索引index_age_birth,这个索引包含了birthday字段,是不是可以用这个现成的索引,不再另加索引?

对MySQL有一些基本了解的开发同学知道MySQL InnoDB的索引查找是按照最左前缀匹配原则的,即SQL中的Where条件中的字段,如果要命中索引,必须按照该索引列的顺序逐一比对,最后定位查找结果。index_age_birth这个索引列的顺序为,明显age在前,birthday在后,所以,不满足最左前缀匹配原则,无法命中该索引。

所以,现在我们必须给birthday这个字段单独加上索引,见下图:

ALTER 

这时,你可能想到birthday这个字段,我们设的默认值为NULL,随之会产生一个疑问:如果某一个字段为NULL,以该字段作为条件进行查询,是否会影响我们查询的性能?今天这个章节,我们就先看看NULL这个值在InnoDB索引结构中是怎么存储的,然后,结合上面这条select查询SQL,看看MySQL又是如何执行这条SQL的,最后给到这个问题的答案。

存储结构

由于之前的用户表记录中没有birthday为NULL的记录,为了讲解NULL值对SQL查询性能的影响,我先添加一条birthday为NULL的记录,如下:

INSERT 

通过《基础篇》中,我对InnoDB索引结构的讲解,我们知道我加的这个index_birthday索引是一个辅助索引,所以,我们就来看一下NULL这个值在该辅助索引的结构是什么样的,如下图:

621a7d769ab71962a6a888a0a35fdca2.png

上图就是一颗birthday字段为索引的B-Tree,辅助索引的B-Tree结构,我在《基础篇》中详细讲解了,大家可以对照之前的讲解看下这张图,我在这里主要说一下NULL值的位置:NULL值被存储到了该辅助索引B-Tree的非叶节点页1、页2和叶子节点页4的最左边。也就说NULL记录总是出现在B-Tree的最左侧。

那么,针对本章《导读》中的这条select语句,MySQL又是如何查找索引的呢?为了方便浏览,我在这边再贴一下这条SQL:

SELECT 

查找过程

在前面的章节,我讲解过了MySQL查找辅助索引的整个过程,那么,结合这个例子,我再讲解一下MySQL是如何在index_birthday这个索引中查找[2007-01-02,2008-08-02]之间的记录的,见下图:

9d0012ae496c178e7ac65f264eb7e474.png

如上图,红色箭头部分,深度遍历这颗B-Tree:

  1. 页1 -> 页3,在页1中,发现2007-01-02大于2006-07-01,所以,箭头流向指向页3。
  2. 页3 -> 页6,发现2007-01-02位于[2006-07-01,2007-06-07]之间,所以,箭头流向指向页6。
  3. 由于页6为叶子节点,而辅助索引B-Tree所有节点内的记录按索引列升序排列,叶子节点之间是双向链表,叶子节点内记录组成单向链表,所以,发现页6中第一条大于等于2007-01-02的记录是<2007-06-06,6>,然后,从页6中的<2007-06-06,6>后开始,顺序遍历<2007-06-06,6>和页7的所有记录。
  4. 发现页7最后一条记录的age的值为2008-02-06,小于2008-08-02,因此,得到所有满足[2007-01-02,2008-08-02]之间的记录的主键6、8、2、5。
  5. 最后根据主键6、8、2、5,到聚簇索引中查询相应记录即可,关于详细查找过程,在这里我留一个悬念,在《IN字段查询多少个值最合适》这一章节中我会详细讲解。

小结

通过上述内容的讲解,我们知道了一张表中的一条记录中的某个字段a,它的值为NULL值,同时,a字段加了索引,那么

  1. a字段为NULL的记录一定出现在辅助索引非叶或叶子节点的最左边,采用深度遍历查找这条记录,效率是最高的。
  2. 查找a字段不为NULL的记录和NULL记录的数量无关,通过辅助索引B-Tree的二分查找是能很快定位到记录的。

所以,表结构中存在默认值为NULL的字段,并不会影响查询的性能。

思考

假设现在有这么两条记录,如下:

INSERT 

如果现在我写了这样一条SQL:

SELECT 

查找这两条记录的过程是怎么样的?

更多关于MySQL源码的解读内容,可以加vx群交流哦!或者知乎私信我,我都会回复的!

https://weixin.qq.com/g/AQYAAMmWP-ei65ZsYYGNtPd1Xt4-_tIcJO8jlAYRhlN1U1T0YdxXejTWCvh5X2sE (二维码自动识别)

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

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

相关文章

c++ 模板类实现堆栈实验报告_编译原理——小型类C编译器的设计和实现(生成8086汇编代码)之1:问题定义以及总体功能...

前面花了两篇文章来介绍词法分析和语法分析&#xff0c;接下来才是比较有意思的部分——一个小型类C编译器的设计和实现&#xff08;其实是编译原理的课程设计啦&#xff01;~&#xff09;我用的是python2.7.13PyQt来做的。。。事实上&#xff0c;正是从编译原理课程设计开始&a…

ansys fluent udf manual 下载_FLUENT流固耦合柱体结构涡激振动仿真案例解析

作者 | 陈东阳博士 仿真秀科普作者一、柱体结构涡激振动定义对于海洋工程、风工程上普遍采用的圆柱形断面结构物&#xff0c;流体绕过柱体时会产生交替发放的泻涡&#xff0c;这种交替发放的泻涡又会在柱体上生成顺流向及横流向周期性变化的脉动压力。如果此时柱体是弹性支撑的…

SQL Server的数据导入MySQL数据库方法简介

第一种是安装mysql ODBC&#xff0c;利用sql server的导出功能&#xff0c;选择mysql数据源&#xff0c;进行数据的直接导出&#xff0c;这种方法很简便&#xff0c;但是针对实际应用有很多弊端&#xff0c;最主要体现就是数据类型问题&#xff0c;首先&#xff0c;sql server数…

添加图标_win10系统轻松添加显示桌面图标的操作方法

win10系统想必大家都非常熟悉吧&#xff0c;然而有时候可能会碰到win10系统对win10系统添加显示桌面图标进行设置&#xff0c;比如近日有用户到本站反映说对win10系统添加显示桌面图标设置的情况&#xff0c;到底该怎么设置win10系统添加显示桌面图标呢&#xff1f;我们只用按照…

分享干货:靠刷算法题,真的可以刷进大厂吗?

在国外 Facebook&#xff0c;Google 等互联网巨头中&#xff0c;算法无疑是面试中的重头戏&#xff0c;不过&#xff0c;在最近几年国内互联网大厂面试中&#xff0c;算法的比重也越来越高&#xff0c;算法不扎实&#xff0c;笔试可能就直接被刷了。那你知道大厂的技术面为什么…

SwitchBox系列 - 介绍

很多客户问到了如何让iAMT能够穿过防火墙或网关被管理&#xff0c;他们中的部分也了解到了Intel工程师开发的SwitchBox方案&#xff0c;但都不是很了解。基于此&#xff0c;我正好有机会来共享一些在SwitchBox方面的经验和理解。虽然Intel AMT技术是基于TCP/IP协议上的&#xf…

获取两个数据的交集_MySQL交集和差集的实现方法

在MySQL中&#xff0c;只支持Union(并集)集合运算&#xff0c;而对于交集Intersect和差集Except并不支持。那么如何才能在MySQL中实现交集和差集呢&#xff1f;一般在MySQL中&#xff0c;我们可以通过in和not in来间接实现交集和差集&#xff0c;当然也有一定局限性&#xff0c…

Asp.Net Core之Identity应用(上篇)

一、前言在前面的篇章介绍中&#xff0c;简单介绍了「IdentityServer4」持久化存储机制相关配置和操作数据&#xff0c;实现了数据迁移&#xff0c;但是未对用户实现持久化操作说明。在总结中我们也提到了&#xff0c;因为「IdentityServer4」本就支持了接入其他认证方式&#…

c++ 读文件_第十六节:读文件,文件的创建,写文件,文件的读写以及鼠标键盘事件和图形绘制...

读文件//读文件文件的创建public 写文件public 文件的读写重点&#xff1a;文件类主要功能&#xff1a;创建&#xff0c;读属性&#xff0c;写属性&#xff0c;删除等文件读写操作File类File类的对象用来获取文件本身的信息&#xff0c;如文件所在目录、文件长度、文件读写权限…

docker安装jenkins并用docker部署net

1. 部署jenkins1.1 创建jenkins的工作目录//创建工作目录 mkdir /var/jenkins_home //赋予权限 chown -R 1000 /var/jenkins_home1.2 通过docker部署1.2.1 拉取镜像docker pull jenkinsci/blueocean1.2.2 生成容器#注意&#xff1a;切换一行执行命令 docker run -u root -d…

ie插件获取dom_读书笔记《DOM编程艺术》DOM

DOM的理解1.1 D&#xff1a;当创建了一个网页并把它加载到Web浏览器中时&#xff0c;DOM就生成了&#xff0c;它将我们编写的网页文档转换成一个文档对象。1.2 O&#xff1a;“对象”是一种自足的数据集合&#xff0c;相关联的变量称为这个对象的属性&#xff0c;只能通过这个对…

针对Fluent-Bit采集容器日志的补充

hello&#xff0c;之前我写过《一套标准的ASP.NET Core容器化应用日志收集分析方案》&#xff0c;在公司团队、微信公众号、Github上反映良好。其中配置Fluent-bit使用Forward协议收集容器日志&#xff0c;需要在Docker-Compose App配置Loging DriverFluentd实践中&#xff0c;…

在每个运行中运行多个查询_在Kubernetes中运行OpenEBS

什么是OpenEBS&#xff1f;现在&#xff0c;OpenEBS是kubernetes下与容器原生和容器附加存储类型相关通用的领先开源项目之一。 通过为每个工作负载指定专用的存储控制器&#xff0c;OpenEBS遵循容器附加存储或CAS的脚步。 为了向用户提供更多功能&#xff0c;OpenEBS具有精细的…

如何在 C# 8 中使用默认接口方法

C# 8 中新增了一个非常有趣的特性&#xff0c;叫做 默认接口方法 (又称虚拟扩展方法)&#xff0c;这篇文章将会讨论 C# 8 中的默认接口方法以及如何使用。在 C# 8 之前&#xff0c;接口不能包含方法定义&#xff0c;只能在接口中定义方法签名&#xff0c;还有一个就是接口的成员…

.Net下二进制形式的文件(图片)的存储与读取 [ZT]

.Net下图片的常见存储与读取凡是有以下几种:存储图片:以二进制的形式存储图片时&#xff0c;要把数据库中的字段设置为Image数据类型(SQL Server),存储的数据是Byte[].1.参数是图片路径:返回Byte[]类型: publicbyte[] GetPictureData(stringimagepath) { /**…

c++tcp接收文件缓存多大合适_网易面经:深剖TCP协议的流量控制和拥塞控制,你懂了吗?...

1.自我介绍项目2.RPC框架和普通http有什么区别和优势&#xff1f; 基于Tcp封装还是http封装的3.rpc是长连接吗&#xff1f;如果要传输一个特别大的文件 底层还是基于流吗&#xff1f; Nio是一个什么IO模型&#xff1f;4.github了的watch star fork5.异常和error的区别&#xff…

如何在 ASP.Net Core 中使用 LoggerMessage

ASP.NET Core 是一个开源的、跨平台的、轻量级模块化框架&#xff0c;可用于构建高性能、可伸缩的web应用程序&#xff0c;你也许不知道 ASP.NET Core 中有一个藏得很深&#xff0c;而且非常强大的特性&#xff0c;那就是 LoggerMessage&#xff0c;与内建的 Logger 相比&#…

模拟器显示空白图片_Kawaks街机模拟器,还是小时候的味道!

APP菜园打造属于我们自己的APP帝国1.打开支付宝app&#xff0c;首页搜索 “8221050” 然后点击快捷功能&#xff0c;天天领红包。2.软件领取流程&#xff1a;1.认真阅读下软件介绍&#xff1b;2.找到图片下方的“获取链接”复制&#xff1b;3.打开手机上的浏览器粘贴链接搜索(…

ASP.NET Core 查看应用状态和统计

在日常开发中&#xff0c;我们需要关注 .NET 应用的资源使用情况&#xff0c;方便排查问题和扩容。通过 Ajax 请求获取统计信息&#xff0c;展示成图表&#xff0c;如下图&#xff1a;CLRStats 插件&#xff0c;一个统计 .NET 应用资源使用情况的插件&#xff0c;包含&#xff…

【Vscode】调试DotNet Core代码

Visual Studio作为宇宙第一的IDE&#xff0c;开发调试.net core app&#xff0c;无一能出其右&#xff0c;我们还需要去了解Visual Studio Code吗&#xff1f;答案是肯定。杀鸡焉用牛刀&#xff1a;就一个hello world的Console App&#xff0c;还需要打开Visual Studio吗&#…