MySQL 基础知识梳理学习(二)----记录在页面层级的组织管理
1.InnoDB的数据存储结构
InnoDB中数据是通过段、簇、页面构成的。

(1)段是表空间文件中的主要组织结构,它是一个逻辑概念,用来管理物理文件,是构成索引、表、回滚段的基本元素。创建一个索引(B+树)时会同时创建两个段,分别是内节点段和叶子段,内节点段用来管理(存储)B+树中非叶子节点(页面)的数据,叶子节点用来管理(存储)B+树中叶子节点数据。一个索引包括2个段,那么一个表的段的数目,就是索引的个数乘以2了。
(2)簇是构成段的基本元素,一个段有若干个簇构成。一个簇是物理上连续分配的一段空间,每个段至少有一个簇,在创建一个段时就会默认创建一个簇。如果存储数据时,一个簇已经不足以放下更多的数据,此时需要从这个段中分配一个新的簇来存放新的数据。一个段所管理的空间大小是无限的,可以一直扩展下去,但扩展的最小单位是簇。簇的空间大小是固定的,一般为64个页面。
一个索引是由两个段组成的,两个段之间的物理位置是没有关系的,而每个段由多个簇组成,多个簇之间的物理位置也是没有关系的。
(3)簇的物理空间内部还可以继续被切分并高效管理。“页面”就是簇在细化之后的产物,它是簇的组成单位,也是段所管理的最小单位、数据库文件管理的最小单位,也是文件中空间分配的最小单位。一个页面默认为16KB。一个簇中可以包含多个页面(默认64)个页面,这个页面数通常被称为“簇的大小”。这些页面都归这个簇管理,在逻辑上(页面号都是从小到到连续的)以及物理上都是连续的。
2.页面是如何对记录组织管理的
InnoDB是使用B+树来保证通过树形结构找到一个记录所在的页面,而在页面内部真正找到这条记录是通过“槽”来完成的。槽的作用是用来在页面内进行数据搜索的,在InnoDB存储引擎中,多条记录对应一个槽。

槽位于页面的最后位置,其长度与页面内存储的记录数有关。
槽中数据的增长是以高字节到低字节的顺序存储的,最高位的槽代表的是页面内索引顺序最小的记录,而低槽位代表的是索引顺序最大的记录,即在页面内,通过槽位置的顺序,来表示业内所有记录的顺序。
可以将槽理解为是一个以下标值为元素值的可自由扩展的数组。并且,这个数组是有序的,在不断增删改的过程中,都会修改这个数组,该平移的平移,该删除的删除,但需要保证的是,每次操作完成之后,槽的数组还是有序的。当然,真实的数组元素值不会是下标,从上面的示意图可以看出,真正的值是页面内槽所对应的记录在页面内的偏移量。所以,如果,页面内数据发生了改变,只需要修改槽的位置即可变相地修改页面内数据的大小关系了。
我们知道,在每条记录开始位置之前的两个字节,是用来存储下一条记录的指针信息的,所以在每一个槽指向的最后一条记录前面,为了体现它会指向下一个槽的第一条记录,都会有一个指向说明框,用来说明指向的值是多少、位置是多少。
从示意图中可以看出,槽中存储的数据是没有顺序的,因为它们是槽所对应的第一个记录在页面内的偏移量,比如第0号位存储的989,这说明本页内最小的记录在偏移为989的位置存储,这个槽对应的数据还可以查询到2、3、4,他们是通过链表连接起来的。值为4的记录是第0号槽的最后一条记录,值为4的记录指向的下一个记录为偏移为289位置值为6,这个位置正好是第1位的槽,第1号槽包括的数据有6、9、11、11、15这四个值。依次类推,可以从槽数据出发,找到页面内所有记录,并且数据都是有序的,可以利用二分查找的方法快速搜索定位找到所需的记录。
最后补充说明一点,页面最后的8个字节,主要存储的页面校验的CHECKSUM值(前四节)和当前页面最新被修改的LSN值(后四节)。
-----主要部分内容参考梳理于网络知识,此仅为学习笔记,在此原创作者感谢!
MySQL 基础知识梳理学习(二)----记录在页面层级的组织管理的更多相关文章
- MySQL 基础知识梳理学习(五)----详解MySQL两次写的设计及实现
一 . 两次写提出的背景或要解决的问题 两次写(InnoDB Double Write)是Innodb中很独特的一个功能点.因为Innodb中的日志是逻辑的,所谓逻辑就是比如插入一条记录时,它可能会在 ...
- MySQL 基础知识梳理学习(七)----sync_binlog
一般在生产环境中,很少用MySQL单实例来支撑业务,大部分的MySQL应用都是采用搭建集群的方法.搭建MySQL集群,可以进行数据库层面的读写分离.负载均衡或数据备份.基于MySQL原生的Replic ...
- MySQL 基础知识梳理学习(四)----GTID
在日常运维中,GTID带来的最方便的作用就是搭建和维护主从复制.GTID的主从模式代替了MySQL早期版本中利用二进制日志文件的名称和日志位置的做法,使用GTID使操作和维护都变得更加简洁和可高. 1 ...
- MySQL 基础知识梳理学习(三)----InnoDB日志相关的几个要点
1.InnoDB的特点 :(1)Fully ACID (InnoDB默认的Repeat Read隔离级别支持):(2)Row-level Locking(支持行锁):(3)Multi-version ...
- MySQL 基础知识梳理学习(五)----半同步复制
1.半同步复制的特征 (1)从库会在连接到主库时告诉主库,它是不是配置了半同步. (2)如果半同步复制在主库端是开启了的,并且至少有一个半同步复制的从节点,那么此时主库的事务线程在提交时会被阻塞并等待 ...
- MySQL 基础知识梳理学习(一)----系统数据库
information_schema 此数据库是MySQL数据库自带的,主要存储数据库的元数据,保存了关于MySQL服务器维护的所有其他数据库的信息,如数据库名.数据库表.表列的数据类型及访问权限等. ...
- MySQL 基础知识梳理学习(六)----锁
1.什么是锁: 对共享资源进行并发访问控制,提供数据的完整性和一致性. 2.锁的区别: 类型 lock latch 对象 事务 线程 保护 数据库内容 内存数据结构 持续时间 整个事务过程 临界资源 ...
- MySQL 基础知识梳理
MySQL 的安装方式有多种,但是对于不同场景,会有最适合该场景的 MySQL 安装方式,下面就介绍一下 MySQL 常见的安装方法,包括 rpm 安装,yum 安装,通用二进制安装以及源码编译安装, ...
- [SQL] SQL 基础知识梳理(二) - 查询基础
SQL 基础知识梳理(二) - 查询基础 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5904824.html 序 这是<SQL 基础知识梳理( ...
随机推荐
- [Swift]LeetCode397. 整数替换 | Integer Replacement
Given a positive integer n and you can do operations as follow: If n is even, replace n with n/2. If ...
- [Swift]LeetCode888. 公平的糖果交换 | Fair Candy Swap
Alice and Bob have candy bars of different sizes: A[i] is the size of the i-th bar of candy that Ali ...
- 【Spark篇】---Spark调优之代码调优,数据本地化调优,内存调优,SparkShuffle调优,Executor的堆外内存调优
一.前述 Spark中调优大致分为以下几种 ,代码调优,数据本地化,内存调优,SparkShuffle调优,调节Executor的堆外内存. 二.具体 1.代码调优 1.避免创建重复的RDD,尽 ...
- 带着萌新看springboot源码03
上一节讲到了快速新建一个springboot应用,以及springboot的自动配置类起作用的时机,并且一起看了一个自动配置类的源码. 这一节我们来粗略看看当用户在浏览器输入一个url,怎么样返回一个 ...
- PyQt:无边框自定义标题栏及最大化最小化窗体大小调整
环境 Python3.5.2 PyQt5 陈述 隐藏掉系统的控制栏,实现了自定义的标题控制栏,以及关闭/最大化/最小化的功能,自由调整窗体大小的功能(跟随一个大佬学的),代码内有详细注释 只要把Mai ...
- 从无到有-在create-react-app基础上接入react-router、redux-saga
搭建项目框架 新建项目 执行如下代码,用create-react-app来建立项目的基础框架,然后安装需要用到的依赖. $ npx create-react-app my-test-project $ ...
- Mac homebrew-1.5以后安装php扩展的方法
一.以前Mac安装php及php扩展的方式 用Mac的童鞋都知道,我们以前都是用brew install php70,brew install php71 这样来安装php的,用brew instal ...
- 记录:C++类内存分布(虚继承与虚函数)
工具:VS2013 先说一下VS环境下查看类内存分布的方法: 先选择左侧的C/C++->命令行,然后在其他选项这里写上/d1 reportAllClassLayout,它可以看到所有相关类的内存 ...
- 在windows中创建.gitignore文件
1.先任意创建一个文件,例如:1.txt 2.打开cmd命令行窗口,到1.txt目录下 windows7/8输入ren 1.txt .gitignore修改成功 windows10输入mv 1.txt ...
- 基于React-Native0.55.4的语音识别项目全栈方案
移动端的API能力验证方案与PC端不一样!不一样!!不一样!!! 即使需要使用的API都存在,也不一定能用,这一点和PC端是有很大区别的,国内的手机系统虽然都是基于Android,但几乎都会经过各大厂 ...