认识Innodb储存引擎

我们知道储存引擎是实际实现读取、储存资料的重要东西
所以今天就来针对Innodb(MySQL的预设引擎)来探讨,更深入的了解它的细节,帮助我们未来面对不同的场景,更有概念去解决问题。

Innodb简介

Innodb把资料储存在磁碟,所以在server重启的时候,资料依然都在。
要注意的是它会先把资料从磁碟读出放到记忆体,实际上处理资料都是在记忆体这端,处理完再将资料写回磁碟。由於读取磁碟的速度远远慢於读取记忆体的速度,如果Innodb把资料一笔一笔从磁碟读取到记忆体里的话会慢死,因此MySQL设计者将资料划分为许多页的概念,磁碟与记忆体互动的最小单位就是一页,一页的大小一般为16kb,也就是说每次会从磁碟读取一页(16kb)的资料到记忆体,每次也是更新一页(16kb)的资料回磁碟。

Innodb行格式

前面提到Innodb将资料储存在磁碟中,这些存於磁碟中资料的格式也就是所称的行格式,总共有四种compact、redundant、dynamic、compressed。先稍微知道就好,不用硬记。

可以这样建立compact行格式的table

mysql> create database ryan_demo_db character set utf8mb4 collate utf8mb4_0900_ai_ci;
Query OK, 1 row affected (0.03 sec)

mysql> use ryan_demo_db;
Database changed
mysql> create table ryan_demo_table (c1 varchar(10), c2 varchar(10) not null, c3 char(10), c4 varchar(10)) charset=ascii row_format=compact;
Query OK, 0 rows affected (0.18 sec)

mysql> insert into ryan_demo_table(c1,c2,c3,c4) values ('aaaa','bbb','cc','d'),('eeee','fff',NULL,NULL);
Query OK, 2 rows affected (0.02 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from ryan_demo_table;
+------+-----+------+------+
| c1   | c2  | c3   | c4   |
+------+-----+------+------+
| aaaa | bbb | cc   | d    |
| eeee | fff | NULL | NULL |
+------+-----+------+------+
2 rows in set (0.00 sec)

补充说明:
在建立资料库的时候如果不是版本8.0的话,照着我的语法下可能会失败,应是字元集或校对规则名称不同,请自行更新为符合你版本的唷。

Innodb行格式-compact

先有认知一笔纪录实际上包含2个部分(真实资料及额外资讯)
真实资料大家理解没有问题,但额外资讯有什麽呢?
主要有3个部分

  1. 变长栏位长度列表
  2. NULL值列表
  3. 纪录标头资讯

我知道这些虽然是中文字,但根本不知道在说什麽...
来~我们一个一个来看

第一个变长栏位长度列表
首先对资料型态要有基本认知,参考这篇
可知道资料分为储存位元组不固定(可变式)的资料(ex : varchar、text等)及储存位元组固定的资料(ex : int、date等)。因此MySQL针对可变式资料额外增加一个变长栏位长度列表,为的就是纪录实际需要多少位元组来储存。

第二个NULL值列表
新增一笔资料时,有时许多栏位都是NULL值,如果这些值都存在真实资料的位置很占空间,所以设了一个NULL值列表来储存避免浪费。

第三个标头资讯(很重要,在後续如何查询资料上会用得到)
这边是由5个位元组也就是40个位元组成。
全部有以下8种栏位

  1. 预留位元1
  2. 预留位元2
  3. deleted_flag(标记纪录是否被删除)
  4. min_rec_flag(B+树的每层非叶子节点中最小的目录项纪录都会增加该标记)(看不懂是正常的,後续会再详细说明,知道有这参数就好)
  5. n_owned(一个页面中的纪录会被分成很多组,每组中有一个带头大哥,其余纪录都是小弟,带头大哥纪录的n_owned值代表该组所有的纪录笔数,小弟纪录的n_owned值都为0)
  6. heap_no(表示目前纪录在页面堆叠中的相对位置)
  7. record_type(表示目前的纪录类型。0:普通纪录、1:B+树非叶子节点的目录项纪录、2:Infimum纪录、3:Supermum纪录)(看不懂是正常的,後续会再详细说明,知道有这参数就好)
  8. next_record(下一笔纪录的相对位置)

至於redundant、dynamic、compressed也是类似的概念,由於我感觉还不是特别重要,就不在这多赘述。

由於内容繁多避免消化不良,今日就只介绍Innodb的主要储存行格式,明日在说明重要的资料页结构,了解实际上储存资料的细节。

敬请期待


<<:  全端入门Day05_何谓全端之後端首篇

>>:  Day 03-选择Node.js&Express

Day 9 任务的形式

今天想发ARM的文章时,居然一直遇到这个画面: 虽然不确定是不是被攻击了,但後来还好可以连上主页了,...

半透明的文字看板

大家好,我是西瓜,你现在看到的是 2021 iThome 铁人赛『如何在网页中绘制 3D 场景?从 ...

Rust-流程控制-if

利用布林值来决定如何继续执行程序进行决策 例 let n = 3; if n > 2 { pr...

11.移转 Aras PLM大小事- 汇出 Mutiple Level BOM

汇出 Mutiple Level BOM 如果要制作出下图表格,可以利用原厂的程序码稍微修改 这样就...

JSONDecoder 介绍 Day 16

JSONDecoder 将抓下来的资讯透过JSONDecoder这个将收集到的资讯进行使用 建立需要...