InnoDB存储引擎表的逻辑存储结构

1.索引组织表:

在InnoDB存储引擎中,表都是依照主键顺序组织存放的。这样的存储方式的表称为索引组织表,在innodb存储引擎表中,每张表都有主键。假设创建的时候没有显式定义主键,则InnoDB会依照例如以下方式选择或者创建主键:

1). 首先推断表中是否有非空的唯一索引,假设有。则该列就为主键。

2).   假设不符合上述条件,则innodb会自己主动创建一个6字节大小的指针

假设表中有多个非空唯一索引时,InnoDB将选择建表时第一个定义的非空唯一索引为主键,通过_rowid能够显示表的主键,可是仅仅能查看单个列作为主键的情况,对于多列组成的主键则不能够。

2.InnoDB逻辑存储结构

全部数据都会被逻辑的存放在一个空间中。称为表空间,表空间由段(segment)、区(extent)、页(page)组成。页有时候也成为块(block)。

表空间:

全部数据都存放在表空间。默认情况下有个共享表空间ibdata1,假设启用了參数innodb_file_per_table。则每张表的数据能够单独放到一个表空间中(默觉得96kb)。可是仅仅存放一定的数据(数据、索引和插入缓冲bitmap页),其它的数据还是存放在共享表空间中,因此在启用这个參数后。共享表空间的大小还是会不断增大。并且innodb存储引擎不会在事务运行rollback时去收缩这个表空间,会推断这些信息是否还须要,不须要则标为可用空间供下次使用。

段(segment):表空间由各个段组成,常见的段有数据段(B+树的叶子节点)、索引段(B+树的非叶子节点)、回滚段等。

存储引擎中对段的管理是自身完毕的。

区(extent): 区是由连续页组成的空间,不论什么情况下每一个区的大小都为1MB。为了保证区中页的连续性,innodb一次从磁盘申请4-5个区,默认情况下innodb页的大小为16kb,即一个区有一共同拥有64个连续的页。从innodb1.0.x版本号開始引入压缩页,即每一个页的大小能够通过參数KEY_BLOCK_SIZE设置为2K、4k、8k。

innodb1.2.x版本号開始新增參数innodb_page_size能够将默认页的大小设置为4k、8k,可是页中的数据库不是压缩。

当中包括一个问题就是用户启用了innodb_file_per_table參数后。创建的表默认大小是96kb,可是区中是64个连续的页,创建的表的大小应该至少是1MB才对,由于在每一个段開始时。先用32个页大小的碎片页来存放数据,使用完之后才申请64个连续页,为了节省磁盘容量的开销。

页(page): 页是innodb磁盘管理的最小单位。默认每一个页的大小为16KB。常见的页有:数据页、undo页、系统页、事务数据页、插入缓冲位图页等。

行:每一个页存放的行记录最多同意存放16kb/2-200行记录,

3.innodb行记录格式:

innodb存储引擎中的记录是以行的形式存储的。这意味着页中保存着一行行的数据,在innodb1.0.x之前,提供了compact和redundant两种格式存放行记录数据,

3.1. compact行记录格式:

mysql5.0以后引入,为了高效的存储数据,一个页中存放的行数据越多,性能越高,其存储方式为:

首部是一个非NULL变长字段长度列表,长度最大不超过2字节,第二部分是null标志位。指示该行数据是否含有null值,有就用1表示,记录头信息固定占用5字节(40位),最后就是实际存储每列的数据。特别注意,null不占用该部分不论什么空间,除了占用null标志位。还有就是每行数据除了用户自己定义的以外,还包括隐藏列。事务id列和回滚指针列。各自是6字节和7字节的大小 ,假设没有主见。每行还会添加一个6字节的rowid列。

3.2. redundant行记录格式:

是mysql5.0版本号之前的行记录存储方式。之后仍然支持这个格式是为了兼容之前版本号的页格式,其存储方式例如以下:

首部是一个字段长度偏移列表,也是依照列的顺序逆序放置的,第二部分记录头信息占用6字节,最后就是实际存储的每列的数据。

3.3. 行溢出树据

innodb存储引擎能够将一条记录的某些数据存储在真正的数据页面之外,一般将blob、lob这类的大对象列类型的存储会把数据存放在数据页面之外,可是,这样的理解有点偏差。能够将varchar列数据类型存放为行溢出数据,mysql数据库的varchar类型能够存放65535字节,可是实际上并不会存放65535字节。当中还有别的开销。实际仅仅能存放65532字节。并且官方定义的65535长度是指全部varchar列的长度总和,假设列的长度总和超过这个长度。依旧无法创建。

Innodb存储引擎的数据都是存放在页类型的B-tree node中,可是当发生行溢出时,数据存放在页类型为uncompress BLOB页中。实际上仅仅有768字节的前缀数据保存在数据页中,之后是偏移量。指向行溢出页(uncompress BLOB page),那么就引出多长的varchar是保存在单个数据页中,从多长開始保存在BLOIB页呢?思考:innodb是索引组织的。也就是B+ tree的结构。这样每一个页中至少有两条行记录(否则就失去了B+
tree的意义,变成链表了),因此假设一个页仅仅能存放一条记录,那么innodb存储引擎会自己主动将行数据存放在溢出页中。

3.4  compressed和dynamic格式

inndob1.0.x開始引入新的文件格式,曾经支持的compact和redundant格式称为antelope文件格式,新的文件格式称为barracuda文件格式,barracuda文件格式拥有两种新的行记录格式:compressed和dynamic格式。

新的行记录格式对于存放在BLOB中的数据採用了全然的行溢出方式,在数据页中仅仅存放20字节的指针,实际的数据都存放在off page中(不同于compact和redundant格式会存放768个前缀字节),

compressed另一个功能 就是存放在当中的数据会以zlib的算法进行压缩,因此对于BLOB、text这类大长度数据可以进行很有效的存储。

3.5 char的行结构存储

存储固定长度的字符类型,mysql4.1版本号開始char(N)中的N指的是字符的长度,而不是之前的字节的长度,因此在不同的字符集下。char类型相应的列内部存储的可能不是定长的数据,因此对于多字节字符编码的char类型的存储,innodb在内部将其视为变长字符类型,

4.innodb数据页结构

由下面7个部分组成:

file header(文件头):定长 38字节

page header(页头):56字节,用来记录数据页的状态信息,0x45BF表示数据页。

infimum和supermum records:

在每一个数据页中有两个虚拟的行记录,用来限定记录的边界。infimum记录是比该页中不论什么主键都要小的值。supermum records是比不论什么可能大的值还要大的值,这两个值在页创建时被建立,而且不论什么情况下不会被删除,在两种不同的行记录格式下所占字节数不同。

user records(用户记录,即行记录)和free space(空暇空间):

free
space是链表数组结构,在一条记录被删除后。该空间就会被增加到空暇链表中

page directory(页文件夹):

存放了页的相对位置,这些记录指针有时候也称为槽或者文件夹槽,在Innodb中。并非每条记录拥有一个槽,innodb的槽是一个稀疏文件夹,即一个槽可能包括多个记录。当记录被删除或者被插入时。须要对槽进行分裂或平衡的维护操作,

file trailer(文件结尾信息):定长 8字节

为了检測页是否已经完整写入了磁盘

时间: 2024-10-25 19:12:57

InnoDB存储引擎表的逻辑存储结构的相关文章

MySQL InnoDB存储引擎之表(一)

主要介绍InnoDB存储引擎表的逻辑存储以及实现.重点介绍数据在表中是如何组织和存放的. 1.索引组织表(index organized table) 在InnoDB存储引擎中,表都是根据主键顺序组织存放的,这种存储方式的表叫索引组织表.在InnoDB存在引擎表中,每张表都有个主键(Primary key),如果在创建表时没有显示定义主键,则会按照如下方式选择或者创建主键:a.判定是否有非空的唯一索引(unique not null),如果有则该列即为主键.若果有多个,则选择建表是第一个定义的非

MySQL存储引擎 -- MyISAM(表锁定) 与 InnoDB(行锁定) 锁定机制

前言 为了保证数据的一致完整性,任何一个数据库都存在锁定机制.锁定机制的优劣直接应想到一个数据库系统的并发处理能力和性能,所以锁定机制的实现也就成为了各种数据库的核心技术之一.本章将对MySQL中两种使用最为频繁的存储引擎MyISAM(表锁定)和Innodb(行锁定)各自的锁定机制进行较为详细的分析. MySQL锁定机制简介 数据库锁定机制简单来说就是数据库为了保证数据的一致性而使各种共享资源在被并发访问访问变得有序所设计的一种规则.对于任何一种数据库来说都需要有相应的锁定机制,所以MySQL自

mysql之innodb存储引擎---数据存储结构

一.背景 1.1文件组织架构 首先看一下mysql数据系统涉及到的文件组织架构,如下图所示: msyql文件组织架构图 从图看出: 1.日志文件:slow.log(慢日志),error.log(错误日志),general.log(基本日志) 2.配置文件:my.cnf 3.数据库:performance_schema,mysql,information_schema,sys 4.innodb存储引擎(框中部分),主要包括有:两个日志文件ib_logfile0和ib_logfile1,由参数inn

MySQL基础篇(05):逻辑架构图解和InnoDB存储引擎详解

本文源码:GitHub·点这里 || GitEE·点这里 一.MySQL逻辑架构 1.逻辑架构图 基于下面的逻辑架构图,可以大致熟悉MySQL各个架构组件之间的协同工作关系. 很经典的C/S架构风格,即客户端/服务端模式. 2.分层描述 客户端连接 通常会进行连接池管理,连接用户权限认证,安全管理等操作. 可以通过如下命令查看连接配置信息:SHOW VARIABLES LIKE '%connect%';可以看到最大连接和每个连接占用的内存等相关配置. 核心功能 第二层架构封装MySQL一系列核心

InnoDB存储引擎的表空间文件,重做日志文件

存储引擎文件:因为MySQL表存储引擎的关系,每个存储引擎都会有自己的文件来保存各种数据.这些存储引擎真正存储了数据和索引等数据. 表空间文件 InnoDB存储引擎在存储设计上模仿了Oracle,将存储的数据按表空间进行存放.默认配置下,会有一个初始化大小为10MB.名为ibdata1的文件.该文件就是默认的表空间文件(tablespace file).你可以通过参数innodb_data_file_path对其进行设置.格式如下: innodb_data_file_path=datafile_

MySQL数据库InnoDB存储引擎多版本控制(MVCC)实现原理分析

文/何登成 导读:   来自网易研究院的MySQL内核技术研究人何登成,把MySQL数据库InnoDB存储引擎的多版本控制(简称:MVCC)实现原理,做了深入的研究与详细的文字图表分析,方便大家理解InnoDB存储引擎实现的多版本控制技术(简称:MVCC). 基本知识 假设对于多版本控制(MVCC)的基础知识,有所了解.MySQL数据库InnoDB存储引擎为了实现多版本的一致性读,采用的是基于回滚段的协议. 行结构 MySQL数据库InnoDB存储引擎表数据的组织方式为主键聚簇索引.由于采用索引

解析MySQL的体系架构及学习Mysql存储引擎MyISAM和InnoDB

mysql体系结构: 由:连接池组件.管理服务和工具组件.sql接口组件.查询分析器组件.优化器组件. 缓冲组件.插件式存储引擎.物理文件组成.mysql是独有的插件式体系结构,各个存储引擎有自己的特点. mysql各个存储引擎概述: (1) innodb存储引擎:[/color][/b] 面向oltp(online transaction processing).行锁.支持外键.非锁定读.默认采用repeaable级别(可重复读)通过next-keylocking策略避免幻读.插入缓冲.二次写

MySQL中常用的存储引擎(MyISAM 和InnoDB)

 数据库存储引擎是数据库底层软件组件,数据库管理系统(DBMS)使用存储引擎进行创建.查询.更新和删除数据操作.不同的存储引擎提供不同的存储机制.索引技巧.锁定水平等功能,使用不同的存储引擎,还可以获得特定的功能.现在许多的数据库管理系统都支持多种不同的存储引擎.MySQL的核心就是存储引擎. 使用 SHOW ENGINES; 命令查看MySQL支持的存储引擎,  Support 列表示某种引擎是否可以使用,YES表示可以,NO表示不可以,DEFAULT表示当前默认存储引擎. mysql> SH

MySQL索引与事务、存储引擎MyISAM和InnoDB (理论+实践篇)

索引的概念 数据库中的索引与书籍中的目录类似 在一本书中,无须阅读整本书,利用目录就可以快速查找所需信息 书中的目录是一个词语列表,其中注明了包含各个词的页码 数据库索引 在数据库中,索引使数据库程序无须对整个表进行扫描,就可以在其中找到所需数据 数据库中的索引|是某个表中一-列或者若干列值的集合,以及物理标识这些值的数据页的逻辑指针清单 索引的的作用 设置了合适的索引之后,数据库利用各种快速的定位技术,能够大大加快查询速率 特别是当表很大时,或者查询涉及到多个表时,使用索引可使查询加快成3 F