(五十二)大白话不断在表中插入数据时,物理存储是如何进行页分裂的?
上回我们讲到了数据页的物理存储结构,数据页之间是组成双向链表的,数据页内部的数据行是组成单向链表的,每个数据页内根据主键做了一个页目录
然后一般来说,你没有索引的情况下,所有的数据查询,其实在物理层面都是全表扫描,依次扫描每个数据页内部的每个数据行。
上述描述,其实就是没有索引情况下在一个表中的数据查询情况,这个速度可以说是慢到惊人,所以一般肯定是不能让查询走全表扫描的。因此正常在数据库中的查询,必须要运用到索引来加速查询的执行。
但是今天还是没法直接切入到索引这块内容,因为作为前置知识,今天还得给大家讲解另外一个知识点,就是我们在一个表里不停的插入数据的时候,会涉及到一个页分裂的过程,也就是说,这个表里是如何出现一个又一个的数据页的。
大家都知道,正常情况下我们在一个表里插入一些数据后,他们都会进入到一个数据页里去,在数据页内部,他们会组成一个单向链表,这个数据页内部的单向链表大致如下所示,我们看看
大家看上面的图,里面就是一行一行的数据,刚开始第一行是个起始行,他的行类型是2,就是最小的一行,然后他有一个指针指向了下一行数据,每一行数据都有自己每个字段的值,然后每一行通过一个指针不停的指向下一行数据,普通的数据行的类型都是0,最后一行是一个类型为3的,就是代表最大的一行。
上面就是一个典型的数据页内部的情况,那么今天要讲的页分裂是什么意思呢?
是这样的,假设你不停的在表里插入数据,那么刚开始是不是就是不停的在一个数据页插入数据?接着数据越来越多,越来越多,此时就要再搞一个数据页了,如下图。
但是此时会遇到一个问题,后续我们会讲到索引这块机制,索引运作的一个核心基础就是要求你后一个数据页的主键值都大于前面一个数据页的主键值,但是如果你的主键是自增的,那还可以保证这一点,因为你新插入后一个数据页的主键值一定都大于前一个数据页的主键值。
但是有时候你的主键并不是自增长的,所以可能会出现你后一个数据页的主键值里,有的主键是小于前一个数据页的主键值的。
比如在第一个数据页里有一条数据的主键是10,第二个数据页里居然有一条数据的主键值是8,那此时肯定有问题了。
所以此时就会出现一个过程,叫做页分裂,就是万一你的主键值都是你自己设置的,那么在增加一个新的数据页的时候,实际上会把前一个数据页里主键值较大的,挪动到新的数据页里来,然后把你新插入的主键值较小的数据挪动到上一个数据页里去,保证新数据页里的主键值一定都比上一个数据页里的主键值大。
大家看下图,假设新数据页里,有两条数据的主键值明显是小于上一个数据页的主键值的,如图所示。
如上图所示,第一个数据页里有1、5、6三条数据,第二个数据页里有2、3、4三条数据,明显第二个数据页里的数据的主键值比第一个数据页里的5和6两个主键都小,所以这个是不行的。
此时就会出现页分裂的行为,把新数据页里的两条数据挪动到上一个数据页,上一个数据页里挪两条数据到新数据页里去,如下图所示。
所以上述就是一个页分裂的过程,核心目标就是保证下一个数据页里的主键值都比上一个数据页里的主键值要大。
这就是今天我们重点要讲的页分裂的过程,有了这个过程,保证了每个数据页的主键值,就能为后续的索引打下基础。
(五十二)大白话不断在表中插入数据时,物理存储是如何进行页分裂的?相关推荐
- 在Sql2005中,向表中插入数据时遇到uniqueidentifier列,如何插入数据?
在Sql2005中,向表中插入数据时遇到uniqueidentifier列,如何插入数据? 原文 http://blog.csdn.net/quou2002/article/details/59650 ...
- 不断在表中插入数据时,物理存储是如何进行页分裂的?
在一个表里不停的插入数据的时候,会涉及到一个页分裂的过程,也就是说,这个表里是如何出现一个又一个的数据页的.正常情况下在一个表里插入一些数据后,都会进入到一个数据页里去,在数据页内部,会组成一个单向链 ...
- (八大方法、逐层深入,有你一定没见过的)使用INSERT语句向表中插入数据
(八大方法.逐层深入,有你一定没见过的)使用INSERT语句向表中插入数据 (八大方法.逐层深入,有你一定没见过的) 使用INSERT语句向表中插入数据(MSSQLSERVER版) 做开发的同仁对于向 ...
- SQL Server向表中插入数据
一.语句 Example 1: --向学生表中插入数据 INSERT INTO STUDENT VALUES(201215121,'李勇','男',20,'CS'); INSERT INTO STUD ...
- Mysql命令insert into:向表中插入数据(记录)
insert into命令用于向表中插入数据. insert into命令格式:insert into <表名> [(<字段名1>[,..<字段名n > ])] v ...
- python学习:向Firebird数据库表中插入数据
向前一篇文章中创建的T1表中插入数据. # -*- coding: utf-8 -*- """ Created on Tue Jul 10 22:06:43 2018 使 ...
- Mysql之向表中插入数据
Mysql之向表中插入数据 语法 以下为向MySQL数据表插入数据通用的 INSERT INTO SQL语法: INSERT INTO table_name ( field1, field2,...f ...
- 使用insert向表中添加数据MySQL_使用INSERT语句向表中插入数据(MSSQLSERVER版)
做开发的同仁对于向数据库中插入数据可谓是太普通不过了,也没什么说的,一般都是采用常用的INSERT INTO [(字段列表)] VALUES(字段值列表),这样的方式进行操作.今天,我要给大家介绍的是 ...
- 4、MySQL——向数据表中插入数据,修改数据表中的数据,数据表删除操作
目录 一.数据表插入操作:INSERT 1. 给表中的所有字段插入数据 2.给表中的个别字段插入数据 3.向数据表中批量插入多条数据 二.数据表修改操作:UPDATE 1.修改所有字段的数据 2.修改 ...
最新文章
- 写实的CG人物角色制作学习教程
- 1.25亿用户以后,Netflix总结的系统高可用经验
- windows服务器双网卡链路聚合_基于windows server 2012的多网卡链路聚合实验设计与......
- Qt Creator设置Conan
- Java FileInputStream finalize()方法与示例
- 【Oracle】并行等待之PX Deq Credit: need buffer
- 开启3389常用终端命令
- 打造自己的VC++ 6.0免安装简版
- 基于JavaWeb实现网上图书商城系统
- python中path函数_示例1-path函数
- Python获取文件MD5
- html实现用户调查的表单网页,江苏开放大学网页制作基础及HTML测试作业二制作1个E游调查的表单网页...
- (C)problem1:C语言阶乘求和
- linux扩展模式触摸屏,在双屏模式下触摸屏校准的问题
- 字节、比特、位的单位换算
- bmzctf-crypto writeup(一) (持续更新)
- 数据改版 | CnOpenData中国工业企业基本信息扩展数据
- 计算机程序设计c++ 8-6:数组指针相关应用
- 【一】先进先出页面置换算法
- java castor_Castor功能与应用参考四
热门文章
- 突破16%“生死线”!央视点名鸿蒙,华为再次“改口”
- mysql密码输入正确但是登陆不进去
- 房屋千千万,如何找到便宜实惠的呢,python采集数据并做数据可视化~
- 2020淘宝双11超级星秀猫怎么踢人 最强星秀猫怎么退出队伍
- python-将DataFrame中的 pandas 系列从字符串(财务缩写)转换为数字
- notify 和 notifyAll的区别
- 制造业的CIO会向COO演变吗?
- 2022年全球市场2代纤维素乙醇总体规模、主要生产商、主要地区、产品和应用细分研究报告
- scrapy爬取QQ音乐榜单歌曲及豆瓣电影信息。
- ceph 客户端配置