数据存储核心引擎InnoDB在MySQL中的重要地位

准备工作

到现在为止,MySQL对于我们来说还是一个“黑盒”,我们只负责使用客户端发送请求并等待服务器返回结果。表中的数据到底存到了哪里?以什么格式存放的?MySQL以什么方式来访问这些数据?这些问题的答案我们统统不知道。我们前面在唠叨请求处理过程的时候提到,MySQL服务器中负责对表中的数据进行读取和写入工作的部分是存储引擎,而服务器又支持不同类型的存储引擎,比如InnoDB、MyISAM、MEMORY啥的。不同的存储引擎一般是由不同的人为实现不同的特性而开发的,真实数据在不同存储引擎中的存放格式一般是不同的,甚至有的存储引擎(比如MEMORY)都不用磁盘来存储数据。也就是对于使用MEMORY存储引擎的表来说,关闭服务器后表中的数据就消失了。由于InnoDB是MySQL默认的存储引擎,也是我们最常用到的存储引擎,另外我们也没有那么多时间去把各个存储引擎的内部实现都看一遍,所以本章要唠叨的是使用InnoDB作为存储引擎的记录存储结构。在了解了一个存储引擎的记录存储结构之后,其他的存储引擎都是“依葫芦画瓢”,就不多唠叨了。

InnoDB 页简介

InnoDB是一个将表中的数据存储到磁盘上的存储引擎,即使我们关闭并重启服务器,数据还是存在。而真正处理数据的过程发生在内存中,所以需要把磁盘中的数据加载到内存中。如果是处理写入或修改请求,还需要把内存中的内容刷新到磁盘上。而我们知道读写磁盘的速度非常慢,与读写内存差了几个数量级。当我们想从表中获取某些记录时,ImnoDB存储引擎需要一条一条地把记录从磁盘上读出来么?不,那样会慢死,InnoDB采取的方式是,将数据划分为若干个页,以页作为磁盘和内存之间交互的基本单位。InnoDB中页的大小一般为16KB。也就是在一般情况下,一次最少从磁盘中读取16KB的内容到内存中,一次最少把内存中的16KB内容刷新到磁盘中。系统变量innodb_page_size表明了InnoDB存储引擎中的页大小,默认值为16384(单位是字节),也就是16KB.该变量只能在第一次初始化MySQL数据目录时指定,之后就再也不能更改了(通过命令mysqld-initialize来初始化数据目录。我们之前没有过多地唠叨初始化数据目录的过程,大家只要知道在服务器运行过程中不可以更改页面大小就好了)

系统变量innodb_page_size表明了InnoDB存储引擎中的页大小,默认值为16384(单位是字节),也就是16KB,该变量只能在第一次初始化MySQL数据目录时指定,之后就再也不能更改了(通过命令mysqld-initialize来初始化数据目录,我们之前没有过多地唠叨初始化数据目录的过程,大家只要知道在服务器运行过程中不可以更改页面大小就好了)

InnoDB 行格式

我们平时都是以记录为单位向表中插入数据的,这些记录在磁盘上的存放形式也被称为行格式或者记录格式。设计 InnoDB 存储引擎的大叔到现在为止设计了 4 种不同类型的行格式,分别是 COMPACT、REDUNDANT、DYNAMIC 和 COMPRESSED。随着时间的推移,他们可能会设计出更多的行格式,但是不管怎么变,这些行格式在原理上大体都是相同的。

指定行格式的语法

我们可以在创建或修改表的语句中指定记录所使用的行格式:

CREATE TABLE 表名(列的信息)ROW_FORMAT=行格式名称;

ALTER TABLE 表名 ROW_FORMAT=行格式名称;

比如在 xiaohaizi 数据库中创建一个演示用的表 record_format_demo,可以这样指定它的行格式:

1
2
3
4
5
6
7
8
9
10
mysql> USE xiaohaizi;
Database changed

mysql> CREATE TABLE record_format_demo (
-> 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.03 sec)

数据存储核心引擎InnoDB在MySQL中的重要地位

https://blog.jiejaitt.top/posts/ccddc3bf.html

作者

JIeJaitt

发布于

2025-03-05

更新于

2025-03-05

许可协议

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×