第47讲:SQL优化之主键优化

news2024/11/23 17:01:45

文章目录

    • 1.主键优化方面的概念
      • 1.1.数据的组织方式
      • 1.2.主键顺序写入的过程
      • 1.3.主键乱序写入引发页分裂的现象
      • 1.4.页合并的概念
    • 2.主键的设计原则

1.主键优化方面的概念

1.1.数据的组织方式

在InnoDB存储引擎中,表的数据都是根据主键顺序组织然后存放的,这种存储方式的表也叫做索引组织表(index organized table IOT)。

在聚集索引中,非叶子节点仅仅起到一个索引数据的作用,叶子节点下挂的都是一行数据,每个叶子节点中主键索引元素都是有顺序关联在一起。

image-20220603102531445

无论是叶子节点还是非叶子节点,数据都是存放在页这个逻辑结构中的,一个页的大小为16K,这也意味着一个页中存储的行是有限的,如果插入的数据在这个页中存储不下,此时会存储在下一个页中,页与页之间通过指针连接。

1.2.主键顺序写入的过程

每一行数据都是存储在页中的,一个页可以是空的,也可以只写入一半的数据,也可以写满整个页,但是每个页中至少要包含2行数据,页中的每条数据都是根据主键进行排列顺序写入

如果一个页中只有一行数据,页与页之间再进行指针连接,就成了二叉树链表的概念.

我们通过下面这幅图观察主键顺序写入的过程:

  • 首先在磁盘中申请一个页page(1),按照主键值的顺序将写入到第一个页中。
  • 当发现第一个页还能写入数据时,数据依旧会在第一个页中写入。
  • 当第一个页写满数据后,会在申请一个页page(2),接下来的数据就会写入到第二个页中,页与页之间会通过指针进行连接。
  • 每当一个页无法再写入数据时,就会再申请一个新的页,继续写入数据。

image-20220603110043459

按照主键顺序在页中写入数据时没有任何问题的,性能也是最高的。

下面我们再来看主键乱序写入会引发的问题。

1.3.主键乱序写入引发页分裂的现象

当我们表中主键字段是乱序写入的情况,就会引发页分裂的现象。

**页分裂的概念:**由于表中主键的数据都是乱序写入,而页中的主键都是顺序存放的,在一个页中存放了一组乱序写入的主键数据,此时又有新的主键要存放到页中,但是页已经满了,页里面的数据都是顺序存放,恰好新增的这个主键就应该存放在这个页里,这时就会产生页分裂的现象,将这个页拿出50%的数据放到一个新的页中,然后将主键数据写入到页中,最后重新分配指针。

下面通过几幅图来演示页分裂的过程:

1)当前有两个页,page1和page2,这里面的主键都是乱序写入的,但是按照页的特性还是将乱序的主键按照顺序排序。

image-20220603111636466

2)此时表中新增了主键为50的一条数据,我们来分析它会不会写入到新的页page3中呢?

其实是不会的,因为页中叶子节点是有顺序排序的,50在47和55之间,应该写入到第一个页或者第二个页中,但是这两个页此时都满了,无法再写入数据了,那么又应该怎么办呢?

image-20220603111830094

3)50在47和55之间,但是第一个页和第二页都满了,无法写入50的数据,此时会申请一个新的页page3。

image-20220603112142751

4)但是并不会直接将50存入page3这个页中,因为这样一来叶子节点就不是顺序排序的了,而是会将第一个页中一半的数据移动到page3这个页中,然后在47的后面插入50这个主键。

image-20220603112307317

5)虽然数据已经写入到新的页中了,但是此时还没有结束,因为这时候叶子节点还不是顺序排序的,按照顺序排序,第三个页此时就应该放在第一个页和第二个页的中间,然后重新设置链表指针,完成数据的关联。

image-20220603112445499

这就是整个页分裂的完整流程,新主键按照顺序写入到该写入的页,但是由于数据满了无法写入,此时就会将这个页中一半的数据拿到新的页中然后将新主键也写在这个新页中,然后移动这个新页到顺序页的位置,最后重新分配指针。

页分裂是比较耗费性能的

1.4.页合并的概念

页合并指的是将有合并可能的多个页组合成一个页,减少索引的空间。

当我们要删除一行记录时,实际上记录并没有被物理删除,会将记录标记为删除的状态,此时这个记录占用的页空间就会允许被其他的数据所使用。

当页中删除的数据达到整个页空间的50%时,也就是说当页的空间空余有50%时,InnoDB就会寻找靠近这个页前后的其他页,分析是否可以将其他的页与这个页合并在一起,从而优化空间的使用。

我们通过下面几幅图来演示页合并的过程:

1)我们要将第二个页中50%的数据删除,后半部分的数据都会标记为删除的状态,此时这些数据占用的空间可以理解为被释放了,允许新的数据写入。

image-20220603113355188

2)当页的剩余空间达到50%时,InnoDB就会寻找靠近第二个页前后的其他页,分析是否有合并的可能性。

image-20220603113533742

3)根据分析发现第一个页是满的,没有合并的条件,而第三个页有恰好有50%的数据可以与第二个页合并,合并后就可以释放第三个页,用来优化占用的空间。

image-20220603113627682

4)页合并之后,新来的主键数据发现第二个页现在是满的,就会在第三个页中写入数据。

image-20220603113708039

这就是完整的页合并现象,当达到页的空间阈值时,就会触发页合并操作,优化占用的空间。

具体页的空间剩余多少时,触发页合并可以通过MERGE_THRESHOLD参数来设置,默认是50%,在创建表或者索引时指定。

2.主键的设计原则

  • 满足业务需求的情况下,尽量降低主键的长度,长度太长会消耗检索的性能。
  • 插入数据时,尽量选择顺序插入,选择使用AUTO_INCREMENT自增主键的方式,避免页分裂。
  • 尽量不要使用UUID或者身份证作为主键,一来是长度很长,二来都是随机顺序,乱序写入,会引发页分裂。
  • 业务操作时,避免对主键进行修改。

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

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

相关文章

集成开发工具IDEA导入新项目,update index时间过长

集成开发工具IDEA导入新项目,update index时间过长,一般这种场景出现在: 1.继承开发工具比较新(使用了优化的索引算法,这种算法一般是前期编译比较慢,一旦编译完,存入缓存,后期搜索就…

为何国家应该大力推行IPV9而不是IPv6.md

不得不说,中国的发展突飞猛进,你看连神舟16号都已经提升了日程。 我们见证了中国的崛起,更见证了中国的力量,集中力量办大事的决心。 当然计算机网络体系也发生了很大的改变,从之前的IPv4到20年前的IPv6的提出,再到现在的IPV9技术的商业实施。 为何IPv6提出了20多年了,普及还是…

11点还不睡会错过肝脏排毒吗?

人体脏器有排毒时间这个说法由来已久,肝经循行时间为晚上11点-1点,这让很多人害怕自己在11点还没睡就会错过肝脏排毒的时间。这个说法是真的吗?肝脏作为人体的“生物加工厂”,24小时都在工作。工作内容包括调节代谢、合成、调节免…

JSONArray.parseArray

1. 需求 最近有个需求: 要接收某个接口的 JSON 数据,而这个JSON数据有可能是一个 JSON 对象,也有可能是一个 JSON数组。 "{name,王五,age:10}""[{name:张三,age:12},{name:李四,age:11}]"现在呢,我需要根据…

指令+运算=CPU

1 组合逻辑电路(Combinational Logic Circuit) 要实现完整CPU功能,除加法器这种电路,还需实现其他功能的电路。有这样一种电路,类似加法器,给定输入,就能得到固定输出。 但仅有组合逻辑电路还…

在风速、风向传感器中,比聚碳酸酯复合材料更好的壳体是哪个?

现如今,铝合金产品在电子行业,已经成为主流产品之一,适用范围广,在各个行业都有普及,其中就包括气象领域。其中,风速、风向变送器为气象仪器,也随着时代的发展,不断更新换代&#xf…

大一计算机新生,感觉什么都学不会怎么办?

虽然今天什么都没做,但是还是辛苦我了。。。刚开始难是正常现象,可以先梳理一下 计算基础基础很重要,实践为上 计算机组成与原理、数据结构、计算机网络、操作系统、编程语言 书看得越多,其实你越能找到自己的方向,一…

“数实融合” 新时代,解读数据治理的新风向

导语 | 数据作为国际数字主权竞争的核心资源,是国家明确增列的新型生产要素。数据质量的高低、数据价值的挖掘,是影响企业发展的关键要素之一。今天我们邀请到了中国信息通信研究院 大数据与区块链部副主任、腾讯云 TVP 姜春宇老师,带领我们解…

C 中的变量作用域 – 局部和全局作用域解释

在编程中,您经常需要处理变量的范围。变量的作用域决定了是否可以在特定代码块内访问和修改它。 在本教程中,你将了解 C 编程语言中的变量作用域。您将看到一些代码示例,以帮助您了解局部变量和全局变量之间的差异。 目录 变量的作用域是什…

react源码解析3.react源码架构

这一章的目的是让我们认识一下react源码架构和各个模块。 在真正的代码学习之前,我们需要在大脑中有一个react源码的地图,知道react渲染的大致流程和框架,这样才能从上帝视角看react是怎么更新的,来吧少年。 react的核心可以用u…

头条权重如何在线查询,头条权重为0怎么办

每个用心用自媒体的创作者们,都听说过权重一说,权重高,也就意味着你的这个账号属于优质账号,推荐量会相应增加,还有一些自媒体会有创作者账号的白名单,优质账号会放在白名单里。 头条权重如何在线查询&…

适用于校园学生公寓的联网智能门锁

常言道:365行,行行出状元。每一个行业都有其特色,每一个行业都离不开一个共同的话题——安全。以联网智能门锁为例,早期的普通智能门锁主要应用于家庭、酒店等场景,能够满足几口之间、小规模流动人员场景使用需求。随着…

yolov8训练自己的数据集

太卷了!!!! 太卷了!!!!太卷了!!!!!太卷了!!!!!太卷了&#xff…

【Nginx】Nginx简介

1. 什么是nginx2. 正向代理与反向代理 2.1 概念2.2 区别 正向代理:客户端 <一> 代理 一>服务端反向代理:客户端 一>代理 <一> 服务端 3. 负载均衡4. 动静分离 1. 什么是nginx Nginx (“engine x”) 是一个高性能的 HTTP 和反向代理服务器,特点是占有内存少…

2022年度【产业数字化金铲奖】重磅来袭!

出品|产业家 第二届金铲奖来了&#xff01; 过去的一年时间里&#xff0c;产业家清晰地看到&#xff0c;数实融合的潮水更加汹涌澎湃且势不可挡&#xff0c;越来越多的企业开始寻求数字化转型&#xff0c;它们来自金融、工业、农业、医疗、能源等等。 产业数字化&#xff0…

ARM汇编 : 汇编指令,伪指令,汇编程序格式

ARM汇编指令ARM指令集特点ARM工作模式ARM寄存器ARM32ARM64ARM64汇编指令内存存储访问指令LDR /STR 指令LDP/STP指令&#xff08;LDR 的变种指令&#xff0c;能够同时操做两个寄存器&#xff09;LDRB /SDRB 指令(只操作一个字节)LDRH /STRH 指令(只操作两个字节)LDUR/STUR指令 (…

Flink之转换算子和一些计算案例(Transformation)

Flink之转换算子 &#xff08;Transformation&#xff09; [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lcaNaXGY645b2f5adabd496ebbee9edfedad6437.png)null)] 数据源读入数据之后&#xff0c;我们就可以使用各种转换算子&#xff0c;将一个或多…

雷达算法 | 一种适用于汽车雷达的聚类算法研究与分析

本文参考TI的一种适用于汽车雷达的聚类算法研究和实现.pdf文档&#xff0c;原文链接如下&#xff1a;https://www.ti.com.cn/cn/lit/an/zhca739/zhca739.pdfts1672973254109&ref_urlhttps%253A%252F%252Fwww.google.com.hk%252F。 由于不涉及硬件&#xff0c;因此本文仅对…

C生万物 | 反汇编深挖【函数栈帧】的创建和销毁

&#x1f451;作者主页&#xff1a;Fire_Cloud_1 &#x1f3e0;学习社区&#xff1a;烈火神盾 &#x1f517;专栏链接&#xff1a;万物之源——C 一文彻底搞懂函数栈帧创建和销毁的过程一、 什么是函数栈帧二、 理解函数栈帧能解决什么问题呢&#xff1f;三、 函数栈帧的创建和…

易基因|糖尿病大血管和微血管病变的表观遗传学调控机制(DNA甲基化+组蛋白修饰):综述

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。2022年12月09日&#xff0c;《Frontiers in Endocrinology》杂志发表了题为“Epigenetic basis of diabetic vasculopathy”的综述文章&#xff0c;综述了表观遗传学修饰如DNA甲基化和组蛋…