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. [Swift]LeetCode274.H指数 | H-Index

    Given an array of citations (each citation is a non-negative integer) of a researcher, write a funct ...

  2. [Swift]LeetCode300. 最长上升子序列 | Longest Increasing Subsequence

    Given an unsorted array of integers, find the length of longest increasing subsequence. Example: Inp ...

  3. [Swift]LeetCode815. 公交路线 | Bus Routes

    We have a list of bus routes. Each routes[i]is a bus route that the i-th bus repeats forever. For ex ...

  4. [Swift]LeetCode928. 尽量减少恶意软件的传播 II | Minimize Malware Spread II

    (This problem is the same as Minimize Malware Spread, with the differences bolded.) In a network of ...

  5. React 中的this.setState

    在react中如何修改state中的数据     第一种写法:this.setState()         参数1:对象 需要修改的数据         参数2:回调 this.setState是一 ...

  6. Django+Bootstrap+Mysql 搭建个人博客(一)

    1.1.环境搭建 (1)虚拟环境 mkvirtualenv website pip install django==1.11.7 (2)创建项目和app:website和blog (3)设置中文set ...

  7. 『Two 树的直径求解及其运用』

    树的直径 我们先来认识一下树的直径. 树是连通无环图,树上任意两点之间的路径是唯一的.定义树上任意两点\(u, v\)的距离为\(u\)到\(v\)路径上边权的和.树的直径\(MN\)为树上最长路径, ...

  8. 华为oj之质数因子

    题目: 质数因子 热度指数:5143 时间限制:1秒 空间限制:32768K 本题知识点: 排序 题目描述 功能:输入一个正整数,按照从小到大的顺序输出它的所有质数的因子(如180的质数因子为2 2 ...

  9. 【朝花夕拾】Android性能篇之(一)序言及JVM

    序言        笔者从事Anroid开发有些年头了,深知掌握Anroid性能优化方面的知识的必要性,这是一个程序员必须修炼的内功.在面试中,它是面试官的挚爱,在工作中,它是代码质量的拦路虎,其重要 ...

  10. Lucene 02 - Lucene的入门程序(Java API的简单使用)

    目录 1 准备环境 2 准备数据 3 创建工程 3.1 创建Maven Project(打包方式选jar即可) 3.2 配置pom.xml, 导入依赖 4 编写基础代码 4.1 编写图书POJO 4. ...