mysql之innodb存储结构

鱼翔空 鱼翔空     2022-12-19     561

关键词:

InnoDB,是MySQL的数据库引擎之一,现为MySQL的默认存储引擎,为MySQL AB发布binary的标准之一。

InnoDB存储结构

  • 以页为单位来管理存储空间;

  • 以页作为磁盘和内存交互的基本单位;

  • 默认页大小为16kb(所以最少一次从磁盘读取16kb的内容),可以通过innodb_page_size 修改页的大小(在初始化时指定 mysqld --initialize);

  • 不同的行格式在磁盘上的存放形式也不同;

  • mysql规定一页中最少存储2行数据

  • 页中需要占用的额外空间需要132字节

compact 行格式(其他的差不多)

  • 变长字段长度列表(2字节)

  • 变长字段包含 varchar varbinary text blob等

  • 按真实占用的字节数逆序存放

  • 长度列表只是表示当前字段在此占用的直接长度(方便探知和检索)

  • null值列表(1字节)

  • 标记允许为NULL的列

  • 用位来存储,1表示为NULL,0表示非NULL

  • null值列表必须是整数个字节(一个字节可以表示8列,设计表是,如果非null,一定要加上not null,字段多时,可以减少一些空间占用)

  • 记录头信息

  • 由固定的5字节组成

  • 可以理解为记录的元数据

  • 记录的真实数据

  • 默认添加row_id(6字节,唯一标记)、trx_id(6字节,事务id)、roll_pointer(7字节,回滚指针)

  • 数据过长时,只会存储前768字节的数据,超过的数据会存储到溢出页中(需要20字节指向真正存储的数据页);

综上:mysql一条记录最少额外占用最少27字节;

上面数据过长,是多长?假设,我们有1个列数据过长,我们可以通过 132+2(n+27)<16*1024 算出当n>8099的时候绝对会溢出;

主键生成策略:

  • 优先使用自定义的主键

  • 没有自定义主键选不允许为NULL的唯一业务主键

  • 以上都没有使用mysql的row_id

InnoDB数据页结构

InnoDB有不同类型的数据页

  • 存放表空间的页

  • 存放数据的页

  • 存放索引的页

  • 存放inode信息的页

  • 存放redo信息的页

  • 存放undo信息的页

Page Header

存储在数据页中的状态信息,包含了存储了多少数据,还有多少空闲,最后插入记录的位置,当前页的最大事务id,在B+树中所处的层级,索引ID(B+树中)

File Header

标注了页号、上一个页的页号,下一个页的页号,页面最后修改对应的额LSN,页的类型,页面被刷新到了哪个LSN,属于哪个表空间

File Trailer

我们都知道磁盘的写入数据远不如内存的cpu缓存的写入。mysql通过redo log来保证最终写入的一致性。在mysql写入磁盘的时候

  • 先将File Header 中的校验值写入到磁盘中

  • 页面刷新到磁盘后,再将File Trailer中的校验写入到磁盘

  • 前后一致写入成功

File Trailer中也会存储最后修改的LSN,如果不一致,会通过redo log进行修复。

如果觉得对你有帮助,请关注公众号:5ycode,后续会不断更新哦

mysql之innodb存储引擎(代码片段)

innodb存储引擎一、mysql组织架构根据以上结构,详解如下1、连接层1.验证用户的身份,用户名密码是否匹配2.提供两种连接方式(TCP/IP连接、socket连接)3.连接层提供了一个与sql层交互的线程2、SQL层1.接收连接层传... 查看详情

mysql进阶之存储引擎

...型。在建表的时候,不指定存储引擎,默认的存储引擎是InnoDB。查看建表语句:showcreatetable表名; 可看到默认的存储引擎就是InnoDB 在建表的时候,可以指定存储引擎,语法格式如下:createtable表名(字段1字段1类型[COMMENT字... 查看详情

mysql数据结构—innodb内存管理

 参照:《mysql内核:innodb存储引擎》 第二章      MySQL系列:innodb源码分析之内存管理:https://blog.csdn.net/yuanrxdu/article/details/40985363  测试环境:Mysql5.6.43版本 此文只是对上面的参考文章做了一个整理。 ... 查看详情

mysql存储引擎-innodb实现原理介绍

目录存储结构内存结构磁盘结构新版本结构演变线程模型数据文件 查看详情

mysql进阶篇之mysql存储引擎

本次学校MySQL的存储引擎,主要包括InnoDB,MyISAM,Memory三种,下面一起来学习吧,很简单,主要涉及一个面试题,哈哈。目录1.MySQL体系结构2.存储引擎简介3.存储引擎特点4.存储引擎选择5.小结1.MySQL体系... 查看详情

innodb引擎的索引和存储结构

...引擎的区别MySQL默认的存储引擎是MyISAM,其他常用的就是InnoDB,另外还有MERGE、MEMORY(HEAP)等。(1)主要的几个存储引擎M 查看详情

mysql的目录结构&&innodb的数据存储与myisam的存储(代码片段)

MySQL的目录结构&&Innodb的数据存储与MyIsam的存储先查看一共有多少个与mysql相关的文件find/-namemysql/var/lib/mysql是MySQL数据库文件的存放路径在mysql中可以用命令查看showvariableslike'datadir';mysql的配置文件位置:/etc/my.cnf相关命... 查看详情

mysql的目录结构&&innodb的数据存储与myisam的存储(代码片段)

MySQL的目录结构&&Innodb的数据存储与MyIsam的存储先查看一共有多少个与mysql相关的文件find/-namemysql/var/lib/mysql是MySQL数据库文件的存放路径在mysql中可以用命令查看showvariableslike'datadir';mysql的配置文件位置:/etc/my.cnf相关命... 查看详情

mysql的varchar水真的太深了——innodb记录存储结构(代码片段)

...较大且涉及到计算,欢迎有兴趣者阅读。文章目录1.InnoDB是干嘛的?2.InnoDB是如何读写数据的?3.varchar疑问千千万——InnoDB行格式3.1dynamic——innodb默认行格式3.2innodb怎么知道varchar真正有多长?——变长字段长度列... 查看详情

《mysql系列-innodb引擎25》表-innodb逻辑存储结构(代码片段)

InnoDB逻辑存储结构  从InnoDB存储引擎的逻辑存储结构看,所有数据都被逻辑地存放在一个空间中,称之为表空间(tablespace)。表空间又由段(segment)、区(extent)、页(page)组成。页在一些文档中有时也称为块(block),InnoDB存... 查看详情

mysql技术内幕:innodb存储引擎的目录

....1定义数据库和实例1.2.mysql体系结构1.3mysql表存储引擎1.3.1innodb存储引擎1.3.2mylsam存储引擎,1.3.3ndb存储引擎1.3.4memory存储引擎1.3.5archive存储引擎1.3.6federated存储引擎1.3.7maria存储引擎1.3.8其他存储引擎1.4各种存储引擎之间的比较1.5连... 查看详情

mysql数据结构—innodb哈希表

  参考:《mysql内核:innodb存储引擎》第二章  测试环境:Mysql5.6.43版本 此文只是对上面的参考文章做了一个整理  查看详情

《mysql系列-innodb引擎22》文件-表结构定义文件(代码片段)

表结构定义文件  因为MySQL插件式存储引擎的体系结构的关系,MySQL数据的存储是根据表进行的,每个表都会有与之相应的文件。但不论表采用何种存储引擎,MySQL都有一个以frm为后缀名的文件,这个文件记录了... 查看详情

详解mysql存储引擎innodb(代码片段)

...表showengines在创建表时指定存储引擎createtable表名engine=innodb;修改已有表的存储引擎altertable表名engine=innodb;文章目录设置存储引擎SQL语句innodb存储引擎存储格式体系架构一.后台线程二.内存关键特性一.插入缓冲二.两次写三.... 查看详情

详解mysql存储引擎innodb(代码片段)

...表showengines在创建表时指定存储引擎createtable表名engine=innodb;修改已有表的存储引擎altertable表名engine=innodb;文章目录设置存储引擎SQL语句innodb存储引擎存储格式体系架构一.后台线程二.内存关键特性一.插入缓冲二.两次写三.... 查看详情

innodb存储引擎存储结构详解-实战篇(代码片段)

...通过数据库文件反编译也比较麻烦。媳妇介绍了一个工具innodb_ruby,说它可以扒mysql数据的结构。这几天扒拉了下,蛮好用的ÿ 查看详情

myrocks之数据字典

...存储引擎,在存储引擎层,会维护自已的元数据信息。在innodb存储引擎中,我们通过information_schema下的INNODB_SYS_DATAFILES,INNODB_SYS_TABLES,INNODB_SYS_INDEXES等表,可以窥视innodb的元数据信息。同样,rocksdb通过information_schem 查看详情

mysql高级--04--innodb数据存储结构---数据页结构

...考右边的帮助文档文章目录数据库的存储结构:页==innoDB讲数据划分为若干个页,默认页的大小默认为16kb==行--页--区--段--表空间---数据库页的内部结构第一部分:文件头和文件尾1.1FileHeader(文件头部)(38字... 查看详情