本篇主要介绍MySQL中常见的存储引擎。
目录
InnoDB是一款兼具高性能和高可靠性的存储引擎。在MySQL中默认以InnoDB作为存储引擎,在创建表时,如果我们没有指定其它存储引擎作为存储引擎,将默认使用InnoDB作为存储引擎。
InnoDB的主要特点如下:
下面我们来了解一下如何使用,才能发挥出InnoDB的最佳效果。
创建InnoDB表的语法如下:
use test_db #选择数据库
create table InnoDB_test(id int primary key auto_increment,name varchar(20)) engine = InnoDB; #创建一个InnoDB表
创建的InnoDB表的表空间文件会保存到数据目录中的数据库同名目录中,例如上面创建的这个表的文件就会被保存如下目录中,文件名为 表名.ibd,里面包含了表的具体数据和相关表描述信息。
我们是无法直接该.ibd文件中的表描述信息的,如果需要读取的话,可以使用ibd2sdi工具进行读取,使用方法如下:
ibd2sdi --dump-file=InnoDB_test.txt InnoDB_test.ibd
通过上述命令就能提取我们的.ibd文件中的表描述信息,并在当前目录生成一个我们可以读懂的.txt文件,文件的内容如下:
在MySQL5.x版本以前的版本中会生成一个.frm文件来单独描述表描述信息。
相对于InnoDB引擎而言,MyISAM引擎的表空间文件占用的空间相对较小,但MyISAM引擎采用的一个表级锁,因此在并发场景下,读写性能相对较低,MyISAM存储引擎通常在中小型web项目以及级数据仓库中的只读或者主要是读的场景中使用。
在创建MyISAM表需要显示指定使用MyISAM引擎,具体语法如下:
CREATE TABLE myisam_test(id int primary key auto_increment ,name varchar(20))ENGINE = MyISAM [DATA DIRECTORY = PATH][INDEX DIRECTORY = PATH];
其中DATA DIRECTORY和INDEX DIRECTORY表示数据文件和索引文件的绝对地址,我们可以显示指定,不指定则使用默认的数据目录来存放数据文件和索引文件。
创建MyISAM表时会根据表名生成三个不同后缀名的文件,分别是.MYD(数据文件)、.MYI(索引文件)、.sdi(表信息描述文件(JSON格式))。这三个文件和InnoDB表的.ibd文件一样,都默认保存在MySQL的数据目录中。
MyISAM表支持三种不同的存储格式,其中FIXED(静态格式),和DYNAMIC(动态格式),根据使用的列类型自动选择,而另一种格式,只能使用myisampack实用程序生成并且为只读。
当表中的列不存在BLOB类型和TEXT类型的列时,在使用CREATE TABLE 或者ALTER TABLE语句创建或者修改表时,可以提过ROW_FORMAT将表设置成动态格式或者静态格式。
使用myisamchk可以将压缩格式的MyISAM表进行解压,语法为myisamcnk --uppack.下面我们来具体了解一下这三种存储格式。
静态格式是MyISAM表的默认格式,一般在表中不含可变类型(varchar,BLOB,TEXT,varbinary)的列时使用,如果包含且长度小于固定的列宽,则字符串用空格补充到列宽,二进制用0x00字节补充到列宽,因此,静态格式中所有列的长度都是固定的。因为长度固定我们可以直接通过行号和固定行的长度来直接定位到目标行在磁盘的位置,从而增加磁盘访问的速度,除此之外,固定的位置还能让我们在数据损坏时更好的进行恢复,但由于无论可变长度的类型是否达到最长,都会补到最长的列宽,这样会造成一定的空间浪费。另外需要注意的是如果当前类可为null,会用1bit的额外空间来标识当前是否为null。总的来说,静态格式的安全性,访问速度和简易性相对更好,但会带来一些空间浪费。
当表中包含可变长度类型的列时,通常使用动态格式,也可以通过ROW_FORMAT = DYNAMIC选项设置。动态格式中,每一行的长度都不是固定的,在每一行中都包含一个标记来指示当前行有多长,如果行因为更新操作而使长度增加,下次如果长度减少,就可能会带来一些空间碎片,可以使用OPTIMIZE TABLE table_name 语句或者myisamcnk -r来整理这些空间碎片。除此之外,在每一行中还包含一个位图,来标识哪些列为空字符串或者值为0,这些被标识的列将不会被保存到磁盘中,因此动态格式的空间占用要小很多,和静态格式一样,会额外用1bit的空间来标识可能为null的列是否为null。使用动态格式时,每一行每一列都可以使用单独的方式来进行压缩,常用的压缩方式如下:
总的来说,动态格式的空间占用要比固定格式小很多,但由于不固定的长度,访问速度相对较慢。
对于使用myisampack生成的只读数据表,统一使用压缩格式,压缩格式的特点如下:
使用MEMORY引擎创建的表,其所有数据都保存到内存中,但由于内存的特殊性,一断机器关闭或者断电都会使数据丢失,因此使用MEMORY存储引擎创建的表一般只用作临时表或者只读的缓存。
MEMORY存储引擎具有如下特点:
创建MEMORY表时,需要在建表语句后面显示指定,具体如下:
CREATE TABLE memory_test(id int primary key auto_increment ,name varchar(20))ENGINE = MEMORY
由于memory表的所有数据都保存到内存中,因此没有专门的文件用来专门保存数据,只有一个sdi文件来保存表描述信息和数据字典。
接下来我们来了解一下MEMORY存储引擎是如何管理内存中的数据时,具体可以总结为以下几点: