数据存储核心引擎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 |
|
数据存储核心引擎InnoDB在MySQL中的重要地位