首页 > 数据库 >MySQL 读书笔记(一)

MySQL 读书笔记(一)

时间:2022-10-24 20:36:36浏览次数:46  
标签:存储 读书笔记 InnoDB MySQL 格式 NULL 数据 主键

1 MySQL 表

1.1 索引组织表

在 InnoDB 存储引擎中,表都是根据主键顺序存放的,这种存储方式称为索引组织表

InnoDB存储引擎中,每张 MySQL表 都有一个唯一主键,如果创建表时没有显式定义主键,InnoDB存储引擎会按照下述规则选择或创建主键:

  • 首先判断表中是否有非空且唯一的字段 (Unique Not Null),如果有,则该列即为主键
  • 如果表中有多个非空且唯一的字段,则选择建表时第一个定义的非空且唯一的字段为主键
  • 如果没有上述字段,则创建一个 6子节 大小的指针
/**
 * 该表有 c,d 两个字段被定义为 Unique Not Null
 * 但先定义的是 d 的索引, 所以该表的主键为 d
 */
CREATE TABLE t (
  a INT NOT NULL,
  b INT NULL,
  C INT NOT NULL,
  D INT NOT NULL,
  UNIQUE KEY(b),
  UNIQUE KEY(d),
  UNIQUE KEY(c)
);

1.2 表空间

在 InnoDB 存储引擎下,所有的数据都被逻辑地存放在表空间

表空间的组成结构如下图所示:Tablespace -> Segment -> Extent -> Page -> Row

1.3 段

表空间由各个段组成,一般有数据段、索引段、回滚段等。

在 InnoDB 引擎下,表是索引组织的,所以数据段和索引段可以分别表述为:

  • 数据段 —— B+树的叶子节点
  • 索引段 —— B+树的非叶子节点

1.4 区

默认情况下,InnoDB存储引擎中,区的大小为1MB,页的大小为16KB,即一个区中包含64个连续的页。可以通过参数调整页的大小为 2KB, 4KB, 8KB 等,但区的大小始终保持1MB,不能调整。

1.5 页

页是 InnoDB 磁盘管理的最小单位,可以通过 innodb_page_size 参数设置页的大小。

常见的页类型有:

  • 数据页
  • undo页
  • 系统页
  • 事务数据页

1.6 行

InnoDB 存储引擎中,记录以行的形式存储,页中保存着一行行的数据。

InnoDB 文件格式与行格式

  1. Antelope文件格式:对应 COMPACT 和 REDUNDANT 行格式
  2. Barracuda文件格式:对应 COMPRESSED 和 DYNAMIC 行格式

在 MySQL 8中,默认使用 Dynamic 行格式

行溢出数据

如果当前页只能存放一条行记录(B+树失去了意义,退化成链表),则 InnoDB 存储引擎会自动将行数据放到溢出页(BLOB Page)中,而数据页中只保留 768 字节的前缀数据。

Compact 格式

Compact格式的设计目标是高效地存储数据,下图为其存储方式。

  • 变长字段长度列表:1/2字节,表示列的长度
  • NULL标志位:1字节,表示行中是否有 NULL 值
  • 记录头信息:5字节
  • 列数据:除用户定义的列外,还包括两个隐藏列(事务ID列和回滚指针列),NULL值不占该部分任何空间

Redundant 格式

Redundant 是 MySQL 为了兼容之前版本的页格式,其存储格式如下所示。

字段长度偏移列表 | 记录头信息 | 列数据 | ....... |

  • 字段长度列表:1/2字节
  • 记录头信息:6字节
  • 列数据:相较于 Compact 行格式,Redundant 格式的 CHAR 类型 Null 值需要占用空间

Compressed 与 Dynamic 格式

这两种行记录格式对于存放在 BLOB 中的数据采用了完全行溢出的方式。相较于之前768字节的前缀数据,这两种行记录格式在数据页中只存放20字节的指针,而实际的数据都存放在Off Page中。

Compressed 行记录格式的另一个特定是它会对存储的行数据以 zlib 算法进行压缩,对于 BLOB、TEXT、VARCHAR等大长度类型的数据能够有效存储。

1.7 Named File Formats 机制

随着 InnoDB 存储引擎的发展,新的页数据结构需要支持新的功能特性,而这些新的页数据结构和之前的页结构并不兼容,因此 InnoDB 存储引擎通过 Named File Formats 机制来解决兼容性问题。

如下图所示,新的文件格式总是包含之前版本的页格式。

1.8 约束

几乎所有的关系型数据库都提供约束机制,该机制用来保证数据库中数据的完整性。

  • 实体完整性:保证表中有一个主键
  • 数据完整性:可通过触发器保证
  • 域完整性:保证每列数据值满足特定的条件

InnoDB 存储引擎提供以下几种约束:

  • Primary Key:主键约束
  • Unique Key:唯一约束
  • Foreign Key:外键约束
  • Default:默认值约束
  • NOT NULL:非空约束

1.9 视图

视图是一个命名的虚表,由 SQL 查询定义,可当作表使用,但视图中的数据没有实际的物理存储。

视图的主要用途是被当做一个抽象层,程序本身不需要关心基表的结构,只需要按照视图定义来获取数据或者更新数据。

# Create View Command
CREATE VIEW view_name [(column_list)]
AS
select_statement
[WITH CHECK OPTION]

标签:存储,读书笔记,InnoDB,MySQL,格式,NULL,数据,主键
From: https://www.cnblogs.com/ylyzty/p/16822681.html

相关文章

  • 统信安装mysql
    ​​https://dev.mysql.com/downloads/repo/apt/​​......
  • mysql创建账号和分配取消权限
    虽然网上资料很多,但自己每次都要查有的麻烦,这里自己记录下。1、没账号时创建账号:createuser'用户名'@'%'identifiedby'密码';%表示不限制,也可以写要限制的具体ip......
  • apt-get 安装 mysql
    apt-get安装mysqlroot@node140:~#apt-getinstallmysql-server正在读取软件包列表...完成正在分析软件包的依赖关系树正在读取状态信息...完成下列软件......
  • 如何使用binlog2sql快速恢复Mysql误删除的数据
    文章目录​​前言​​​​......
  • day17 MySQL的安装 & 数据库基本语法——增删改查
    day17MySQL登录数据库mysql-hlocalhost-P3307-uroot-p查看所有数据库showdatabases;退出数据库exit;//现有表格usesitu;//使用哪个数据库createtable......
  • mysql的not in 优化
    有一个项目,mysql语句采用了notin,结果某些页面打开需要40多秒,排查sql语句后,发现是采用了notin语法导致全表扫描,消耗了大量的时间,飘易记录下优化的过程:项目简介:会议应......
  • mysql 联表更新某个字段
    想把i表中的数据通过关联关系,更新到m表中updateT_MuasmLEFTJOINT_Infoasionm.F_InfoId=i.F_Idsetm.F_InfoUuid=i.F_Uuid这里的join可以使用常见的......
  • MySQL中数据类型宽度
    一、数据类型的取值范围和宽度字段类型对应的取值范围:类型字节有符号取值范围无符号取值范围TINYINT1-128~1270~255SMALLINT2-32768~327670......
  • springboot整合elasticsearch实现MySQL模糊查询
    es关联mysql实现模糊查询的数据流:   1、使用logstash同步mysql数据到eslogstash简介及基本操作:https://blog.csdn.net/yurun_house/article/details/109025588win......
  • mysql事务和隔离级别学习--笔记
    一、MySQL事务1、什么事事务事务(transaction)就是一个最小的单独任务单元由一个或多个SQL语句组成,在这个任务单元中,每个SQL语句都是相互依赖,整个任务单元是作为一个不可分......