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 基础知识梳理学习(二)----记录在页面层级的组织管理的更多相关文章

  1. MySQL 基础知识梳理学习(五)----详解MySQL两次写的设计及实现

    一 . 两次写提出的背景或要解决的问题 两次写(InnoDB Double Write)是Innodb中很独特的一个功能点.因为Innodb中的日志是逻辑的,所谓逻辑就是比如插入一条记录时,它可能会在 ...

  2. MySQL 基础知识梳理学习(七)----sync_binlog

    一般在生产环境中,很少用MySQL单实例来支撑业务,大部分的MySQL应用都是采用搭建集群的方法.搭建MySQL集群,可以进行数据库层面的读写分离.负载均衡或数据备份.基于MySQL原生的Replic ...

  3. MySQL 基础知识梳理学习(四)----GTID

    在日常运维中,GTID带来的最方便的作用就是搭建和维护主从复制.GTID的主从模式代替了MySQL早期版本中利用二进制日志文件的名称和日志位置的做法,使用GTID使操作和维护都变得更加简洁和可高. 1 ...

  4. MySQL 基础知识梳理学习(三)----InnoDB日志相关的几个要点

    1.InnoDB的特点 :(1)Fully ACID (InnoDB默认的Repeat Read隔离级别支持):(2)Row-level Locking(支持行锁):(3)Multi-version ...

  5. MySQL 基础知识梳理学习(五)----半同步复制

    1.半同步复制的特征 (1)从库会在连接到主库时告诉主库,它是不是配置了半同步. (2)如果半同步复制在主库端是开启了的,并且至少有一个半同步复制的从节点,那么此时主库的事务线程在提交时会被阻塞并等待 ...

  6. MySQL 基础知识梳理学习(一)----系统数据库

    information_schema 此数据库是MySQL数据库自带的,主要存储数据库的元数据,保存了关于MySQL服务器维护的所有其他数据库的信息,如数据库名.数据库表.表列的数据类型及访问权限等. ...

  7. MySQL 基础知识梳理学习(六)----锁

    1.什么是锁: 对共享资源进行并发访问控制,提供数据的完整性和一致性. 2.锁的区别: 类型 lock latch 对象 事务 线程 保护 数据库内容 内存数据结构 持续时间 整个事务过程 临界资源 ...

  8. MySQL 基础知识梳理

    MySQL 的安装方式有多种,但是对于不同场景,会有最适合该场景的 MySQL 安装方式,下面就介绍一下 MySQL 常见的安装方法,包括 rpm 安装,yum 安装,通用二进制安装以及源码编译安装, ...

  9. [SQL] SQL 基础知识梳理(二) - 查询基础

    SQL 基础知识梳理(二) - 查询基础 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5904824.html 序 这是<SQL 基础知识梳理( ...

随机推荐

  1. logback.xml sql语句输出

    在使用springBoot框架之后,日志配置文件变成了logback.xml,输出sql语句的方法为: <!-- 打印sql语句 --> <logger name="com ...

  2. RabbitMQ学习笔记(六) RPC

    什么RPC? 这一段是从度娘摘抄的. RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的 ...

  3. Java__线程---基础知识全面实战---坦克大战系列为例

    今天想将自己去年自己编写的坦克大战的代码与大家分享一下,主要面向学习过java但对java运用并不是很熟悉的同学,该编程代码基本上涉及了java基础知识的各个方面,大家可以通过练习该程序对自己的jav ...

  4. InterlliJ Debug方式启动:method breakpoints may dramatically show down debugging

    使用idea在DEBUG的时候出现Method breakpoints may dramatically slow down debugging, 如图: 根据语义可能是断点打在方法上面了,导致在某个 ...

  5. docker-swarm相关命令和注意事项

    在k8s出现之后,docker-swarm使用的人越来越少,但在本地集成开发环境的搭建上,使用它还是比较轻量级的,它比docker-compose最大的好处就是容器之间的共享和服务的治理,你不需要li ...

  6. Docker折腾手记-安装

    安装 docker红的发紫,所以博主耳闻这么久,也要来折腾折腾了 研究不多,个人目前认为docker给我们带来了以下好处 开发机器因为开发原因,需要配置各种各校的环境,繁琐且耗费资源.配来配去还容易环 ...

  7. Connection open error . Connection Timeout Expired. The timeout period elapsed during the post-login phase.

    是这样的,最近我在开发Api(重构),用的数据库是Sqlserver,使用的Orm是 SqlSugar(别问我为什么选这个,boss选的同时我也想支持国人写的东西,且文档也很全). 被催的是,写好了程 ...

  8. 探索Windows命令行系列(1):导航目录

    探索Windows命令行系列(1):导航目录 探索Windows命令行系列(2):命令行工具入门 探索Windows命令行系列(3):命令行脚本基础 探索Windows命令行系列(4):通过命令操作文 ...

  9. 聊聊 scala 的模式匹配

    一. scala 模式匹配(pattern matching) pattern matching 可以说是 scala 中十分强大的一个语言特性,当然这不是 scala 独有的,但这不妨碍它成为 sc ...

  10. [零] Java 语言运行原理 JVM原理浅析 入门了解简介 Java语言组成部分 javap命令使用

    Java Virtual Machine  官方介绍 Java虚拟机规范官方文档 https://docs.oracle.com/javase/specs/index.html 其中以java8的为 ...