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]

视图更新

对于某些视图来说是可更新的,即可以使用 UPDATE、DELETE 和 INSERT 等语句来更新基本表中的内容。

对于可更新的视图,需要保证视图中的行记录和表中的行记录是一对一的关系。

如果视图中包含以下结构中的任何一种,则其是不可更新:

  • 聚合函数 SUM(),MIN(),MAX(),COUNT() 等
  • DISTINCT 关键字
  • GROUP BY 子句
  • HAVING 子句
  • UNION 或 UNION ALL 运算符
  • FROM 自不可更新视图
  • ALGORITHM 选项为 TEMPTABLE

MySQL 读书笔记(一)的更多相关文章

  1. 【MySQL 读书笔记】SQL 刷脏页可能造成数据库抖动

    开始今天读书笔记之前我觉得需要回顾一下当我们在更新一条数据的时候做了什么. 因为 WAL 技术的存在,所以当我们执行一条更新语句的时候是先写日志,后写磁盘的.当我们在内存中写入了 redolog 之后 ...

  2. 【MySQL 读书笔记】普通索引和唯一索引应该怎么选择

    通常我们在做这个选择的时候,考虑得最多的应该是如果我们需要让 Database MySQL 来帮助我们从数据库层面过滤掉对应字段的重复数据我们会选择唯一索引,如果没有前者的需求,一般都会使用普通索引. ...

  3. 【MySQL 读书笔记】RR(REPEATABLE-READ)事务隔离详解

    这篇我觉得有点难度,我会更慢的更详细的分析一些 case . MySQL 的默认事务隔离级别和其他几个主流数据库隔离级别不同,他的事务隔离级别是 RR(REPEATABLE-READ) 其他的主流数据 ...

  4. 【MySQL 读书笔记】全局锁 | 表锁 | 行锁

    全局锁 全局锁是针对数据库实例的直接加锁,MySQL 提供了一个加全局锁的方法, Flush tables with read lock 可以使用锁将整个表的增删改操作都锁上其中包括 ddl 语句,只 ...

  5. 【MySQL 读书笔记】当我们在使用索引的时候我们在做什么

    我记得之前博客我也写过关于索引使用的文章,但是并不全面,这次尽量针对重点铺全面一点. 因为索引是数据引擎层的结构我们只针对最常见使用的 Innodb 使用的 B+Tree 搜索树结构进行介绍. 每一个 ...

  6. 【MySQL 读书笔记】当我们在执行该查询语句的时候我们在干什么

    看了非常多 MySQL 相关的书籍和文章,没有看到过如此优秀的专栏.所以未来一段时间我会梳理读完该专栏的所学所得. 当我们在执行该查询语句的时候我们在干什么 mysql> select * fr ...

  7. 【MySQL 读书笔记】“order by”是怎么工作的?

    针对排序来说,order by 是我们使用非常频繁的关键字.结合之前我们对索引的了解再来看这篇文章会让我们深刻理解在排序的时候,是如何利用索引来达到少扫描表或者使用外部排序的. 先定义一个表辅助我们后 ...

  8. 高性能MySQL --- 读书笔记(2) - 2016/8/2

    第1章 MySQL架构 MySQL架构与其他数据库服务器大不相同,这使它能够适应广泛的应用.MySQL足够灵活,能适应高要求架构.例如Web应用,同时还适用于嵌入式应用.数据仓库.内容索引和分发软件. ...

  9. 高性能MySQL --- 读书笔记(1) - 2016/8/2

    此书不但帮助MySQL初学者提高使用技巧,更为有经验的MySQL DBA指出了开发高性能MySQL应用的途径.全书包括14章,内容覆盖MySQL系统架构.设计应用技巧.SQL语句优化.服务器性能调优. ...

  10. 【MySQL 读书笔记】当我们在执行更新语句的时候我们在做什么

    该篇其实重点涉及两个日志的使用和处理. 一个是 server 层的 binlog 一个是服务器层的 redolog. 首先还是根据主线来介绍当我们在执行更新语句的时候我们在做什么 Redo Log M ...

随机推荐

  1. SpringIOC以及AOP注解开发

    和 XML 配置文件一样,注解本身并不能执行,注解本身仅仅只是做一个标记,具体的功能是框架检测到注解标记的位置,然后针对这个位置按照注解标记的功能来执行具体操作. 本质上:所有一切的操作都是 Java ...

  2. Shell 更多结构化命令(流程控制)

    更多的结构化命令 上一章里,你看到了如何通过检查命令的输出和变量的值来改变 shell 脚本程序的流程.本章会继续介绍能够控制 shell 脚本流程的结构化命令.你会了解如何重复一些过程和命令,也就是 ...

  3. CORS(cross origin resource sharing)

    1.什么是CORS 定义:跨域资源共享. 2.什么是跨域资源共享 允许浏览器可以从当前源服务器通过ajax访问另外一个源服务地址. 3.同源策略 是浏览器的一个安全功能,不同源的客户端脚本在没有明确的 ...

  4. python-文件内容操作

    1.按文件中数据的组织形式把文件分为文本文件和二进制文件两类. 文本文件:文本文件存储的是常规字符串,由若干文本行组成,通常每行以换行符'\n'结尾.常规字符串是指记事本或其他文本编辑器能正常显示.编 ...

  5. Spring Boot 中处理跨域

    HTML 5中新增的跨域资源访问(Cross-Origin Resource Sharing)特性可以让我们在开发后端系统的时候决定资源是否允许被跨域访问.所谓跨域指的是域名不同或者端口不同或者协议不 ...

  6. ASP.NET Core 读取配置文件信息

    一:读取配置文件 先来看一下appsettings.json文件的内容,如下图: { "ConnectionStrings": { "ServerConnection&q ...

  7. 实验二 c语言中的表达式及输入输出函数编程应用

    1.    格式符%04d的作用是:在左边填充数字0,输出变量的所有数字且左对齐 #include <stdio.h>int main() { int num; scanf("% ...

  8. shell编程【一】

    参考网址:[Linux命令大全][]:https://linux265.com/course/linux-commands.html 为什么要学习shell指令? 学习shell指令的本身也是在了解L ...

  9. Spring AOP的动态代理原理和XML与注解配置

    AOP 实现底层就是对上面的动态代理的代码进行了封装,封装后我们只需要对需要关注的部分进行代码编写,并通过配置的方式完成指定目标的方法增强. 相关术语: Target(目标对象):代理的目标对象 Pr ...

  10. pip安装报错 cannot uninstall a distutils installed project

    sudo pip install --ignore-installed xxx 在安装jupyter notebook的时候,遇到了这个问题,于是上网搜索,搜到了靠谱答案github解决方案 sudo ...